{"version":3,"file":"client/scripts/global.3dceb243932808238833.js","mappings":"UAAIA,E,kBCIG,MAAM,EAAWC,GAAkBC,SAASC,cAAmBF,GAEzD,EAAYA,GAAkBC,SAASE,iBAAsBH,GAE7DI,EAAa,CAACC,EAAgCL,IAAkBK,EAAQH,cAAmBF,GAgH3FM,EAAoB,KAC7B,IAAKC,OAAOC,mBACR,OAAO,EAEX,QAAiCC,IAA7BF,OAAOG,kBAEP,OAAOH,OAAOG,kBAElB,MACMC,EADUV,SAASW,OAAOC,MAAM,KACPC,MAAKF,GAAUA,EAAOG,OAAOC,WAAW,oBAEvE,OADAT,OAAOG,kBAAoE,UAAhDC,aAAc,EAAdA,EAAgBE,MAAM,KAAK,GAAGI,eAClDV,OAAOG,iBAAiB,EAMtBQ,EAAW,CAACC,EAAqBC,KAE5C,IAAIC,GAAgD,EAG/Cd,OAAOe,gBACVf,OAAOe,cAAgB,CAAC,EACxBf,OAAOe,cAAcC,mBAAqB,CAACC,EAAWC,KACpD,GAAID,EAAW,CACb,IAAIE,EAAQ,IAAIC,YAAYH,EAAW,CACrCI,OAAQH,IAEVlB,OAAOsB,cAAcH,EACvB,IAIEpB,MACFe,GAAuC,GAQ3C,IAAIS,EAAY,GACZC,GAAa,EACbC,GAA8B,EAIlC,MAAMC,EAAQ,KACZ,MAAMC,EAAY,KAChB,IAAKH,EAAY,CAEfA,GAAa,EACb,IAAK,IAAII,EAAI,EAAGA,EAAIL,EAAUM,OAAQD,IAOpCL,EAAUK,GAAGE,GAAGC,KAAK/B,OAAQuB,EAAUK,GAAGI,KAG5CT,EAAY,EACd,GAEExB,MAAwBC,OAAOiC,sBAC5BnB,IACHA,GAAuC,EACvCd,OAAOkC,iBAAiB,yBAAyB,KAC/ClC,OAAOiC,uBAAwB,EAC/BN,GAAW,IACV,IAILA,GACF,EAeF,GAAwB,mBAAbf,EACT,MAAM,IAAIuB,UAAU,gDAIlBX,EACFY,YAAW,WACTxB,EAASC,EACX,GAAG,IAIHU,EAAUc,KAAK,CAAEP,GAAIlB,EAAUoB,IAAKnB,IAGV,aAAxBnB,SAAS4C,WACXF,WAAWV,EAAO,GACRD,IAEN/B,SAASwC,mBAEXxC,SAASwC,iBAAiB,mBAAoBR,GAAO,GAErD1B,OAAOkC,iBAAiB,OAAQR,GAAO,IAEzCD,GAA8B,GAChC,EAuBK,IAAIc,EAA2C,GAE/C,MAAMC,EAAerB,IAC1BA,EAAMsB,KAAKnC,MAAM,KAAKoC,SAASD,I,MAG7B,GAFItB,EAAMA,QAAOA,EAAMwB,OAAS,IAAiB,QAAZ,EAAAxB,EAAMwB,cAAM,QAAI,GAASxB,EAAMA,QAEhEA,EAAMwB,OACR,IAAK,IAAIC,KAAQzB,EAAMwB,OAAQ,CAC7B,IAAIE,EAEJ,GAAID,aAAI,EAAJA,EAAME,OAAQ,CAChB,IAAIC,EAAgCC,EAAiBP,EAAMG,aAAI,EAAJA,EAAME,QAC7DC,IACFF,EAAYE,EAEhB,CAEA,GAAIH,aAAI,EAAJA,EAAMzB,MAAO,CACf,IAAI8B,EAA+BC,EAAgBT,EAAMG,aAAI,EAAJA,EAAMzB,OAC3D8B,IACFJ,EAAYI,EAEhB,CAEA,KAAKL,aAAI,EAAJA,EAAMzB,UAAUyB,aAAI,EAAJA,EAAME,QAAQ,CAEjC,IAAIK,EAAgCC,EAAWX,GAC3CU,IACFN,EAAYM,EAEhB,CAEAN,EAAYA,EAAUjC,SAASyB,KAAKO,EAAKhC,UAAYyC,EAAeZ,EAAMG,EAC5E,CAGFlD,SAAS4D,KAAKC,oBAAoBd,EAAMe,GACxC9D,SAAS4D,KAAKpB,iBAAiBO,EAAMe,EAAmB,GACxD,EAiBEA,EAAsBC,IAC1B,MAAMC,EAAcD,EAAEC,OAGtB,IAAIC,EAAcC,EAAsBF,GACxC,GAAIC,EAAa,CACf,MAAMf,EAAyBI,EAAiBS,EAAEhB,KAAMkB,GAIxD,aAHIf,aAAI,EAAJA,EAAMhC,WACRiD,EAA0BjB,aAAI,EAAJA,EAAMhC,SAAU6C,GAG9C,CAIA,GADAE,EAAcG,EAAqBJ,GAC/BC,EAAa,CACf,MAAMf,EAAyBM,EAAgBO,EAAEhB,KAAMkB,GAIvD,aAHIf,aAAI,EAAJA,EAAMhC,WACRiD,EAA0BjB,aAAI,EAAJA,EAAMhC,SAAU6C,GAG9C,CAGA,MAAMb,EAAOmB,EAAgBN,EAAEhB,OAC3BG,aAAI,EAAJA,EAAMhC,WACRiD,EAA0BjB,aAAI,EAAJA,EAAMhC,SAAU6C,EAE5C,EAGII,EAA4B,CAACG,EAAsBP,KACvD,IAAK,IAAIb,KAAQoB,EACfpB,SAAAA,EAAMb,KAAK,KAAM0B,EACnB,EAGIJ,EAAiB,CAACZ,EAAcG,KACpCL,EAAgBF,KAAK,CACnBI,KAAMA,EACNK,OAAQF,aAAI,EAAJA,EAAME,OACd3B,MAAOyB,aAAI,EAAJA,EAAMzB,MACbP,SAAU,CAACgC,aAAI,EAAJA,EAAMhC,WACjB,EAGEwC,EAAca,GACX1B,EAAgBhC,MAAK,EAAGkC,OAAMK,SAAQ3B,WAAYsB,IAASwB,IAAanB,IAAW3B,IAGtF+B,EAAkB,CAACe,EAAkBC,IAAwC3B,EAAgBhC,MAAK,EAAGkC,OAAMtB,WAAYsB,IAASwB,IAAa9C,QAAAA,EAAS,OAAS+C,QAAAA,EAAa,MAE5KlB,EAAmB,CAACiB,EAAkBE,IAAyC5B,EAAgBhC,MAAK,EAAGkC,OAAMK,YAAaL,IAASwB,IAAanB,QAAAA,EAAU,OAASqB,QAAAA,EAAc,MAEjLJ,EAAmBE,GAAuC1B,EAAgBhC,MAAK,EAAGkC,OAAMK,SAAQ3B,WAAYsB,IAASwB,IAAanB,IAAW3B,IAE7IyC,EAAyBF,GAAWU,EAAgBV,EAAQ,eAE5DI,EAAwBJ,GAAWU,EAAgBV,EAAQ,cAE3DU,EAAkB,CAACV,EAAQW,K,UAC/B,IAAIV,EAA4C,QAA9B,EAAAD,aAAM,EAANA,EAAQY,WAAWD,UAAW,eAAEE,MAElD,OADKZ,IAAaA,EAAuD,QAAzC,EAAiB,QAAjB,EAAAD,EAAOc,kBAAU,eAAEF,WAAWD,UAAW,eAAEE,OACpEZ,CAAW,ECtTb,MAyBMc,EAAkBC,GARP,CAACA,GAA4B,iBAARA,EAQEC,CAASD,IAA+B,UAAvBA,aAAG,EAAHA,EAAKhE,eAexDkE,EAAc,CAAC9E,EAAsB+E,K,MAChD,GAAI/E,aAAO,EAAPA,EAASgF,UACXhF,EAAQgF,UAAYD,MAEjB,CACH,IAAIE,EAAarF,SAASsF,cAAc,OACxCD,EAAWE,UAAYJ,EACJ,QAAnB,EAAA/E,aAAO,EAAPA,EAAS0E,kBAAU,SAAEU,aAAaH,EAAYjF,EAChD,GAuCWqF,EAAU,CAACC,EAAwBC,IAAyB,IAAID,GAAI1C,SAASe,GAAOA,EAAE6B,MAAMC,QAAUF,GAAe,UAIrHG,EAAWJ,GAAqDA,EAAG1C,SAASe,GAAOA,EAAE6B,MAAMC,QAAU,SAErGE,EAAO,CAACC,EAA4BL,IAAyBF,EAAQ,CAACO,aAAoBC,QAAUD,EAAW,EAAQA,IAAYL,GAEnIO,EAAQF,GAA+BF,EAAQ,CAACE,aAAoBC,QAAUD,EAAW,EAAQA,KAOjGG,EAAY,CAACT,EAA0EU,K,QAClG,KAAIC,MAAMC,QAAQZ,IAAOA,aAAca,UAMrC,OADAF,MAAMC,QAAQF,GAAqD,QAAvC,EAAAV,aAAE,EAAFA,EAA8Bc,iBAAS,SAAEC,UAAUL,GAAqD,QAAvC,EAAAV,aAAE,EAAFA,EAA8Bc,iBAAS,SAAEC,OAAOL,GACtIV,EALPA,EAAG1C,SAAS5C,I,QACViG,MAAMC,QAAQF,GAA+B,QAAlB,EAAAhG,aAAO,EAAPA,EAASoG,iBAAS,SAAEC,UAAUL,GAA+B,QAAlB,EAAAhG,aAAO,EAAPA,EAASoG,iBAAS,SAAEC,OAAOL,EAAU,GAK/G,EAGW,EAAS,CAACV,EAA2BU,K,QAChD,OAAIC,MAAMC,QAAQF,IACH,QAAb,EAAAV,aAAE,EAAFA,EAAIc,iBAAS,SAAEE,OAAON,GACfV,IAGI,QAAb,EAAAA,aAAE,EAAFA,EAAIc,iBAAS,SAAEE,IAAIN,GACZV,EAAE,EAWEiB,EAAWvG,MACZA,EAAQwG,aAAexG,EAAQyG,cAAgBzG,EAAQ0G,iBAAiB3E,QAoDvE4E,EAAc,CAACf,EAAgCI,EAAgBY,KAGtEhB,aAAoBiB,aAAajB,EAASQ,UAAUU,OAAOd,EAAWY,EAAM,EAGrE,EAAW,CAAoCG,EAASC,KACnE,IAAIC,EAEJ,MAAO,IAAIC,IACT,IAAIC,SAASC,IACPH,GACFI,aAAaJ,GAGfA,EAAU3E,YAAW,IAAM8E,EAAQL,KAAQG,KAAQF,EAAQ,GAC3D,ECnPOM,EAAS,SAAiDC,GACrE,IAAIC,EAEJ,MAAMC,EAAa,K,QAEjB,IACyB,QAAvB,EAAe,QAAf,EAAAF,aAAI,EAAJA,EAAMG,iBAAS,eAAEC,cAAM,SAAEC,MAAMJ,EACjC,CAAE,MAAOK,GAET,GAGIC,EAAQC,IACZ,IACEP,EAAW,IAAID,KAASQ,GAAY,GACtC,CAAE,MAAOC,GAET,CAEIT,EAAKG,UAAUO,eAAe,WAEhCpH,EAAS4G,EACX,EAGcF,EAAc,QAE1BW,EAASd,QAAQG,EAAc,QAAGA,GAAOQ,WAClCR,EAAc,QACrBO,EAAKC,EAAS,IAEdD,GACN,EAGMI,EAAsB,CAC1BC,aAAc,CAAC,EACfC,cAAe,GACfhB,QAAS,SAAUiB,EAA+Bd,EAAWe,GAC3DD,EAAQzF,SAASE,IACf,MAAMyF,GDkNOC,EClNC,GDmNX,IAAMC,KAAKC,SAASC,SAAS,IAAIC,OAAO,EAAGJ,IADlC,IAACA,ECjNbN,EAASC,aAAaI,GAAM,CAAEM,KAAMN,EAAIxB,KAAM,IAAIjE,EAAKiE,KAAKjE,EAAKgG,MAAQ,CAAC,IACtEZ,EAASC,aAAaI,GAAIxB,KAAKkB,eAAe,WAChDC,EAASE,cAAc7F,KAAKgG,EAC9B,IAGEL,EAASE,cAAcrG,OAAS,EAClCmG,EAASE,cAAcxF,SAAQ,CAACE,EAAMiG,KACpC,GAAIb,EAASC,aAAarF,GAAMiE,KAAKkB,eAAe,UAAW,CAC7D,MAAMe,EAAiBd,EAASC,aAAarF,GAAMiE,KAEnD,IAAIkC,EAAYD,EAAuB,OACvCE,OAAOC,eAAeH,EAAgB,SAAU,CAC9CI,IAAK,IACIH,EAETI,IAAK,SAAUzE,GACb,GAAIA,IAAQqE,GACNrE,GACEoE,IACFd,EAASE,cAAckB,OAAOP,EAAO,UAC9BC,EAAuB,OAEQ,IAAlCd,EAASE,cAAcrG,QAAgBuG,GAAI,CAC7C,IAAIiB,EAAgC,GACpC,IAAK,MAAMC,KAAOtB,EAASC,aACzB,GAAID,EAASC,aAAaF,eAAeuB,GAAM,CAC7C,MAAM1G,EAAOoF,EAASC,aAAaqB,GACnCD,EAAehH,KAAKO,EAAKiE,KAC3B,CAEFuB,EAAGrG,KAAKwH,KAAMF,EAChB,CAKNN,EAAYrE,CACd,EACA8E,YAAY,EACZC,cAAc,GAElB,KAGFrB,SAAAA,EAAIrG,KAAKwH,KAEb,GAeF,IAAuGG,EAAUC,EAAWjF,EAArBgF,EAIxFV,OAAOxB,UAJ2FmC,EAIhF,QAJ2FjF,EAIlF,CACxC8E,YAAY,EACZC,cAAc,EACdG,UAAU,EACV,KAAArF,CAAiBoF,EAAME,GACrB,IAAIC,EAAcP,KAAKI,GACrBI,EAAcD,EACdE,EAAS,WACP,OAAOD,CACT,EACAE,EAAS,SAAqBvF,GAE5B,OADAoF,EAASC,EACDA,EAASF,EAAQ9H,KAAKwH,KAAMI,EAAMG,EAAQpF,EACpD,SAES6E,KAAKI,IAEdX,OAAOC,eAAeM,KAAMI,EAAM,CAChCT,IAAKc,EACLb,IAAKc,EACLT,YAAY,EACZC,cAAc,GAGpB,GA3BAT,OAAOC,eAAeS,EAAKC,EAAMjF,GCgD5B,IAAOwF,GAAd,SAAcA,GACI,EAAAC,oBAAhB,SAAoCvB,GAClC,GAAIA,EAAM,CACR5I,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EACtDxB,EAAKjG,OAAOD,SAASvB,IACdnB,OAAOoK,iBAAiBzH,SAC3B3C,OAAOoK,iBAAiBzH,OAAS,IAEnC3C,OAAOoK,iBAAiBzH,OAAON,KAAKlB,EAAM,IAG5CnB,OAAOoK,iBAAiBC,SAAWrK,OAAOoK,iBAAiBC,UAAY,CAAC,EAExE,IAAK,MAAMC,KAAW1B,EAAKyB,SACpBrK,OAAOoK,iBAAiBC,WAAYrK,OAAOoK,iBAAiBC,SAASC,KAC1EtK,OAAOoK,iBAAiBC,SAASC,GAAW1B,EAAKyB,SAASC,IAG5DtK,OAAOoK,iBAAiBG,aAAevK,OAAOoK,iBAAiBG,cAAgB,CAAC,EAEhF,IAAK,MAAMC,KAAe5B,EAAK2B,aAExBvK,OAAOoK,iBAAiBG,cAAiBvK,OAAOoK,iBAAiBG,aAAaC,KACnFxK,OAAOoK,iBAAiBG,aAAaC,GAAe5B,EAAK2B,aAAaC,IAGxExK,OAAOoK,iBAAiBK,cAAgBzK,OAAOoK,iBAAiBK,eAAiB,CAAC,EAElF,IAAK,MAAMC,KAAS9B,EAAK6B,cAElBzK,OAAOoK,iBAAiBK,gBAAiBzK,OAAOoK,iBAAiBK,cAAcC,KACpF1K,OAAOoK,iBAAiBK,cAAcC,GAAS9B,EAAK6B,cAAcC,IAGpE1K,OAAOoK,iBAAiBO,OAAS3K,OAAOoK,iBAAiBO,QAAU,CAAC,EAEhE/B,EAAK+B,SACP3K,OAAOoK,iBAAiBO,OAAS/B,EAAK+B,QAGxC,IAAK,MAAMC,KAAgBhC,EAAKiC,cACzB7K,OAAOoK,iBAAiBS,eAC7B7K,OAAOoK,iBAAiBS,cAAcxI,KAAKuI,EAE/C,CACF,EAEgB,EAAAE,0BAAhB,SAA0ClC,GAEnCA,IAEA5I,OAAOoK,iBAAiBW,aAC3B/K,OAAOoK,iBAAiBW,WAAa,CAAC,GAExCnC,EAAKlG,SAAQ,CAAC6B,EAAe+E,KAC3BtJ,OAAOoK,iBAAiBW,WAAWzB,GAAO/E,CAAK,IAEnD,EAEgB,EAAAyG,mBAAhB,W,MAEMC,EAKJ,OANAjL,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EAEwBlK,OAArC,QAArC,EAAAF,OAAOoK,iBAAiBc,qBAAa,eAAEC,mCACzCF,EAA+F,GAArFjL,OAAOoK,iBAAiBc,cAAcC,iCAG3CF,CACT,EAEgB,EAAAG,SAAhB,WAEE,IAAIH,EAKJ,OANAjL,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EAElDpK,OAAOoK,iBAAiBiB,OAC1BJ,EAASjL,OAAOoK,iBAAiBiB,MAG5BJ,CACT,EAEgB,EAAAK,SAAhB,WAEE,IAAIL,EAKJ,OANAjL,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EAElDpK,OAAOoK,iBAAiBmB,WAC1BN,EAASjL,OAAOoK,iBAAiBmB,UAG5BN,CACT,EAEgB,EAAAO,OAAhB,WACExL,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EACtD,IAAIa,EAAyB,GAK7B,OAJIjL,OAAOoK,iBAAiBzH,SAC1BsI,EAASjL,OAAOoK,iBAAiBzH,QAG5BsI,CACT,EAEgB,EAAAQ,YAAhB,WACEzL,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EAClDpK,OAAOoK,iBAAiBzH,SAC1B3C,OAAOoK,iBAAiBzH,OAAS,GAErC,EAEgB,EAAA+I,iCAAhB,W,MAEMT,EAKJ,OANAjL,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EAEwBlK,OAArC,QAArC,EAAAF,OAAOoK,iBAAiBc,qBAAa,eAAEC,mCACzCF,EAA+F,GAArFjL,OAAOoK,iBAAiBc,cAAcC,iCAG3CF,CACT,EAEgB,EAAAU,gCAAhB,W,MAEMV,EAKJ,OANAjL,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EAEuBlK,OAApC,QAArC,EAAAF,OAAOoK,iBAAiBc,qBAAa,eAAEU,kCACzCX,EAA8F,GAApFjL,OAAOoK,iBAAiBc,cAAcU,gCAG3CX,CACT,EAEgB,EAAAY,eAAhB,W,QACE7L,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EACtD,IAAIa,EAAgC,GAKpC,OAJ0C,QAAtC,EAAuB,QAAvB,EAAAjL,OAAOoK,wBAAgB,eAAEc,qBAAa,eAAEY,YAC1Cb,EAASjL,OAAOoK,iBAAiBc,cAAcY,UAG1Cb,CACT,EAEgB,EAAAc,WAAhB,SAA2BC,GAEzB,OADc9B,EAAgB2B,iBAAiBtL,MAAK0L,GAAmBA,EAAgBtD,KAAKjI,eAAiBsL,EAAYtL,eAE3H,EAEgB,EAAAwL,gBAAhB,WACE,IAAIjB,EAAmB,GAEvB,OADAf,EAAgB2B,iBAAiBnJ,SAAQyJ,GAAWlB,EAAO5I,KAAK8J,EAAQxD,QACjEsC,CACT,EAEgB,EAAAmB,gBAAhB,SAAgCJ,GAC9B,IAAIG,EAAUjC,EAAgB2B,iBAAiBtL,MAAK0L,GAAmBA,EAAgBtD,KAAKjI,eAAiBsL,EAAYtL,gBACzH,OAAQyL,GAAWA,EAAQE,OAC7B,EAEgB,EAAAC,cAAhB,SAA8BN,EAAqB/K,G,QAC7CkL,EAAUjC,EAAgB6B,WAAWC,GACzC,SAAKG,IAAYA,EAAQE,aACrBF,EAAQI,kBAKiG,QAApG,EAA2FrM,OAD3D,QAAd,EAAAiM,EAAQxJ,cAAM,eAAEnC,OAAOgM,QAAQ,MAAO,IAAIlM,MAAM,MAC/CC,MAAKY,GAASA,EAAMX,OAAOE,eAAiBO,EAAUP,uBAA2B,SAE/G,EAEgB,EAAA+L,QAAhB,SAAgDpE,GAC9CrI,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EACtD,IAAIa,EAAY,KAIhB,OAHIjL,OAAOoK,iBAAiBC,WAC1BY,EAASjL,OAAOoK,iBAAiBC,SAAShC,IAErC4C,CACT,EAEgB,EAAAyB,UAAhB,SAAkDC,GAChD3M,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EACtD,IAAIa,EAAY,KAChB,IACMjL,OAAOoK,iBAAiBC,WAC1BY,EAASjL,OAAOoK,iBAAiBC,SAASsC,GAE9C,CACA,MAAOhF,GAAS,CAEhB,OAAOsD,CACT,EAEgB,EAAA2B,SAAhB,SAAiDC,GAC/C,IAAIC,EAAsB,GAI1B,OAHAD,EAAInK,SAAS2F,IACXyE,EAAezK,KAAK6H,EAAgBuC,QAAWpE,GAAI,IAE9CyE,CACT,EAEgB,EAAAC,WAAhB,SAAmDC,GACjD,IAAIF,EAAsB,GAI1B,OAHAE,EAAQtK,SAASmG,IACfiE,EAAezK,KAAK6H,EAAgBwC,UAAa7D,GAAO,IAEnDiE,CACT,EAEgB,EAAAG,YAAhB,WACEjN,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EACtD,IAAIa,EAAc,GAIlB,OAHIjL,OAAOoK,iBAAiBC,WAC1BY,EAASjL,OAAOoK,iBAAiBC,UAE5BY,CACT,EACgB,EAAAiC,gBAAhB,WACElN,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EACtD,IAAIa,EAAS,GAIb,OAHIjL,OAAOoK,iBAAiBG,eAC1BU,EAASjL,OAAOoK,iBAAiBG,cAE5BU,CACT,EAEgB,EAAAkC,mBAAhB,SAAmCC,EAAkBC,GACnD,IAAKD,IAAaC,EAAW,OAAO,KACpC,IAAIC,EAAiBtN,OAAOoK,iBAAiBG,aAAa6C,GAC1D,OAAKE,IAAmBA,aAAc,EAAdA,EAAgBC,YACnBD,EAAeC,WAAWC,QAAQH,GADI,IAI7D,EAEgB,EAAAI,sBAAhB,SAAsCpF,GACpCrI,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EACtD,IAAIa,EAAiC,KAMrC,OAJIjL,OAAOoK,iBAAiBK,gBAC1BQ,EAASjL,OAAOoK,iBAAiBK,cAAcpC,IAG1C4C,CACT,EAEgB,EAAAyC,uBAAhB,SAAuCb,GACrC,IAAIc,EAAmC,GAIvC,OAHAd,EAAInK,SAAS2F,IACXsF,EAAOtL,KAAK6H,EAAgBuD,sBAAsBpF,GAAI,IAEjDsF,CACT,EAEgB,EAAAC,0BAAhB,WACE5N,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EACtD,IAAIa,EAAmC,GAMvC,OAJIjL,OAAOoK,iBAAiBK,gBAC1BQ,EAASjL,OAAOoK,iBAAiBK,eAG5BQ,CACT,EAEgB,EAAA4C,OAAhB,SAAuBxF,GACrBrI,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EACtD,IAAIa,EAAsB,KAI1B,OAHIjL,OAAOoK,iBAAiB0D,UAC1B7C,EAASjL,OAAOoK,iBAAiB0D,QAAQzF,IAEpC4C,CACT,EAEgB,EAAA8C,WAAhB,WACE/N,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EACtD,IAAIa,EAAwB,GAI5B,OAHIjL,OAAOoK,iBAAiB0D,UAC1B7C,EAASjL,OAAOoK,iBAAiB0D,SAE5B7C,CACT,EAEgB,EAAA+C,iBAAhB,W,MAEE,OADAhO,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EAC9CpK,OAAOoK,mBAAyD,QAArC,EAAApK,OAAOoK,iBAAiBS,qBAAa,eAAEhJ,QAAS,CACrF,EAEgB,EAAAoM,cAAhB,WACEjO,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EACtD,IAAIa,EAA+B,GAInC,OAHIjL,OAAOoK,iBAAiBS,gBAC1BI,EAASjL,OAAOoK,iBAAiBS,eAE5BI,CACT,EACgB,EAAAiD,mBAAhB,WACElO,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EAClDpK,OAAOoK,iBAAiBS,gBAC1B7K,OAAOoK,iBAAiBS,cAAgB,GAE5C,EAEgB,EAAAsD,UAAhB,W,MAEE,OADAnO,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EAC9CpK,OAAOoK,mBAAkD,QAA9B,EAAApK,OAAOoK,iBAAiBzH,cAAM,eAAEd,QAAS,CAC9E,EAEgB,EAAAuM,OAAhB,WAEE,IAAInD,EAIJ,OALAjL,OAAOoK,iBAAiBO,OAAS3K,OAAOoK,iBAAiBO,QAAU,CAAC,EAEhE3K,OAAOoK,iBAAiBO,SAC1BM,EAASjL,OAAOoK,iBAAiBO,QAE5BM,CACT,EAEgB,EAAAoD,gBAAhB,WACE,IAAIC,EAAc,KAMlB,OALAtO,OAAOoK,iBAAmBpK,OAAOoK,kBAAoB,CAAC,EAClDpK,OAAOoK,kBAAoBpK,OAAOoK,iBAAiBiB,OACrDiD,EAActO,OAAOoK,iBAAiBiB,KAAKkD,cAGtCD,CACT,EAEgB,EAAAE,cAAhB,SAA8BlF,GAI5B,OAHKtJ,OAAOoK,iBAAiBW,aAC3B/K,OAAOoK,iBAAiBW,WAAa,CAAC,GAEjC/K,OAAOoK,iBAAiBW,WAAWzB,EAC5C,EAEgB,EAAAmF,uBAAhB,WAUE,MATmC,CACjCC,UAAWC,aAAaC,QAAQC,EAAiBH,WACjDI,OAAQH,aAAaC,QAAQC,EAAiBC,QAC9CC,SAAUJ,aAAaC,QAAQC,EAAiBE,UAChDC,UAAWvK,EAAekK,aAAaC,QAAQC,EAAiBI,YAChEC,cAAezK,EAAekK,aAAaC,QAAQC,EAAiBK,gBACpEC,SAAU1K,EAAekK,aAAaC,QAAQC,EAAiBM,WAC/DC,UAAWT,aAAaC,QAAQC,EAAiBO,WAGrD,EAEgB,EAAAC,gBAAhB,SAAgCC,GAC9B,IAAIC,EAAYZ,aAAaC,QAAQC,EAAiBW,iBAClDC,EAASvF,EAAgBwF,eAAeH,GAExCtE,GAAS,EAUb,OARIwE,GAHoBd,aAAaC,QAAQC,EAAiBc,qBAI5D1E,GAAS,GAGPqE,GACFX,aAAaiB,QAAQf,EAAiBc,kBAAmBF,GAGpDxE,CACT,EAEgB,EAAAyE,eAAhB,SAA+BG,GAC7B,IAAIxP,EAAS,CAAC,EAKd,OAJAX,SAASW,OAAOC,MAAM,KAAKoC,SAAQ,SAAU0C,GAC3C,IAAKkE,EAAK/E,GAASa,EAAG9E,MAAM,KAC5BD,EAAOiJ,EAAI9I,QAAU+D,CACvB,IACOlE,EAAOwP,EAChB,EACgB,EAAAC,iBAAhB,SAAiCC,GAC3BA,EACFpB,aAAaiB,QAAQf,EAAiBmB,eAAgB,KAGtDrB,aAAasB,WAAWpB,EAAiBmB,eAE7C,EACgB,EAAAE,kBAAhB,WAGE,QAFkBvB,aAAaC,QAAQC,EAAiBmB,eAO1D,CACD,CA9XD,CAAc9F,IAAAA,EAAe,K,0SC/KtB,MAAMiG,EAAb,cAGmB,KAAAC,oBAA8B,GAC9B,KAAAC,gBAA0B,EACnC,KAAAC,wBAAkC,CA+H5C,CA5HQ,UAAAC,CAAWC,G,yCACfjH,KAAKiH,OAASA,QACRjH,KAAKkH,6BACX/Q,SAASwC,iBAAiB,mBAAoBqH,KAAKmH,gBAAgBC,KAAKpH,MAC1E,G,CAEO,aAAAqH,CAAczP,GACnB,OAAO,IAAI8F,SAAqBC,GAAY,EAAD,gCACzC,GAAIqC,KAAKiH,SACFtG,EAAgBgG,oBAAqB,CACxC,MAAMhP,EAAYqI,KAAKiH,OAAOK,aAAa1P,GACvCD,IACE6E,MAAMC,QAAQ9E,GAChBA,EAAUwB,SAAevB,GAAU,EAAD,sCAC1BoI,KAAKuH,gBAAgB3P,EAC7B,YAGMoI,KAAKuH,gBAAgB5P,GAGjC,CAEFgG,GACF,KACF,CAEc,0BAAAuJ,G,yCAEZ,GAA8B,SADA9B,aAAaC,QAAQC,EAAiBkC,6BAGlE,YADAxH,KAAK+G,wBAAyB,GAIhC,MAAMU,EAAmBrC,aAAaC,QAAQC,EAAiBoC,0BAC/D,GAAID,EAEF,IACEzH,KAAK2H,WAAaC,KAAKC,MAAMJ,EAC/B,CAAE,MAAOrJ,GACP4B,KAAK2H,WAAa,CAChBG,eAAgB,KAChBC,cAAe,GAEnB,CAEJ,G,CAEc,6BAAAC,G,mDAEZ,IAAIC,EAAc,EAClB,MAAMC,EAAiB,CAACC,EAAWC,iBAAkBD,EAAWE,kBAAmBF,EAAWG,mBAE9F,IAAK,MAAM1Q,KAAwB,QAAf,EAAAoI,KAAK2H,kBAAU,eAAEI,cAC+B,GAA9DG,EAAeK,SAA2B,QAAlB,EAAY,QAAZ,EAAA3Q,aAAK,EAALA,EAAO4Q,aAAK,eAAEtP,YAAI,eAAE/B,gBAC9C8Q,IAIAA,GAAejI,KAAK8G,iBACtB1B,aAAaiB,QAAQf,EAAiBkC,4BAA6B,QACnExH,KAAK+G,wBAAyB,EAC9B3B,aAAasB,WAAWpB,EAAiBoC,2BAGzCtC,aAAaiB,QAAQf,EAAiBoC,yBAA0BE,KAAKa,UAAUzI,KAAK2H,Y,IAI1E,eAAAJ,CAAgB3P,G,yCAC5B,OAAO,IAAI8F,SAAqBC,GAAY,EAAD,gC,QACpCqC,KAAK2H,aAA8B,QAAf,EAAA3H,KAAK2H,kBAAU,eAAEG,kBAAkC,QAAf,EAAA9H,KAAK2H,kBAAU,eAAEI,iBAC5E/H,KAAK2H,WAAa,CAChBG,eAAgBnH,EAAgBuE,yBAChC6C,cAAe,KAInB/H,KAAK2H,WAAWI,cAAcjP,KAAK,CAAE,MAASlB,IAE9C,MAAM8Q,EAAMd,KAAKa,UAAUzI,KAAK2H,YAC1BgB,GAAQ,IAAIC,aAAcC,OAAOH,GACjCI,EAAO,IAAIC,KAAK,CAACJ,GAAQ,CAC7BzP,KAAM,mCAKR,GAFA8G,KAAKgJ,MAAQF,EAET9I,KAAK+G,uBAAwB,QACL/G,KAAKiJ,kBAAkBjJ,KAAK2H,aACpC3H,KAAK6G,4BACf7G,KAAKkJ,uBAEf,YAEQlJ,KAAKgI,gCAGbrK,GACF,KACF,G,CAEc,oBAAAuL,G,oDACO,QAAf,EAAAlJ,KAAK2H,kBAAU,eAAEG,kBAAgD,QAA9B,EAAe,QAAf,EAAA9H,KAAK2H,kBAAU,eAAEI,qBAAa,eAAEzP,QAAS,GAAK0H,KAAKgJ,QACxFG,UAAUC,WAAW,oBAAqBpJ,KAAKgJ,OAC/ChJ,KAAK2H,WAAa,KAClB3H,KAAKgJ,MAAQ,K,IAIH,eAAA7B,G,yCACqB,WAA7BhR,SAASkT,iBAAgCrJ,KAAK+G,+BAC1C/G,KAAKkJ,uBAEf,G,CAEM,iBAAAD,CAAkB9I,G,yCAEtB,MAAMmJ,EAAa1B,KAAKa,UAAUtI,GAIlC,OAHc,IAAIyI,aAAcC,OAAOS,GAAYhR,OACzB,IAG5B,G,MC9HYiR,E,sSCNP,MAAMC,EAEX,UAAAxC,CAAWC,GACTjH,KAAKiH,OAASA,CAChB,CAEA,aAAAI,CAAczP,GACZ,OAAO,IAAI8F,SAAqBC,GAAY,kCAC1C,GAAKqC,KAAKiH,OAAV,CACA,IAAItP,EAAYqI,KAAKiH,OAAOK,aAAa1P,SACnCoI,KAAKyJ,gBAAgB9R,GAC3BgG,GAHwB,CAI1B,KACF,CAEM,eAAA8L,CAAgBC,G,yCACpB,OAAO,IAAIhM,SAAqBC,GAAY,kCACtC+L,IACFjT,OAAkB,UAAIA,OAAkB,WAAK,GAC7CA,OAAkB,UAAEqC,KAAK,CAAE6Q,UAAW,OAClCnN,MAAMC,QAAQiN,GAChBjT,OAAkB,UAAEqC,QAAQ4Q,GAE5BjT,OAAkB,UAAEqC,KAAK4Q,IAG7B/L,GACF,KAKF,G,GD1BF,SAAc4L,GAM8B,IAAIK,iBADnB,wBAGX,EAAAC,WAAhB,SAA2BC,EAAiBC,EAAiBC,EAAgBC,GAc7E,EAEgB,EAAAC,IAAhB,SAA+B/J,GAsS/B,EAEgB,EAAAgK,eAAhB,WAMA,EAEgB,EAAAC,UAAhB,WAQA,EAEgB,EAAAC,WAAhB,WAQA,EAEgB,EAAAC,2BAAhB,WAuBA,EAYgB,EAAAC,gBAAhB,WAuDA,EAEgB,EAAAC,sBAAhB,WAOA,EAEgB,EAAAC,iBAAhB,WAwBA,EAEgB,EAAAC,oBAAhB,SAAoCrL,GAC9B,CAWN,EAEgB,EAAAsL,kBAAhB,SAAkCtL,GAC5B,CAKN,EAWgB,EAAAuL,eAAhB,WACE,MAAMC,EAAM,IAAIC,KAOhB,MAAO,IALQD,EAAIE,WAAa,GAAK,IAAM,IAAMF,EAAIE,eACpCF,EAAIG,aAAe,GAAK,IAAM,IAAMH,EAAIG,iBACxCH,EAAII,aAAe,GAAK,IAAM,IAAMJ,EAAII,iBACnCJ,EAAIK,kBAAoB,GAAK,KAAQL,EAAIK,kBAAoB,IAAM,IAAM,IAAOL,EAAIK,mBAG5G,CACD,CApgBD,CAAc3B,IAAAA,EAAiB,KERxB,MAAM4B,GACJ,EAAAC,cAAwB,gBAG1B,MAAMC,GACJ,EAAAC,gBAAmBC,GACOpV,SAASC,cAAc,QAAQoV,aAAaD,G,0SCJxE,MAAME,EAEX,UAAAzE,CAAWC,GACTjH,KAAKiH,OAASA,CAChB,CAEA,aAAAI,CAAczP,GACZ,OAAO,IAAI8F,SAAqBC,GAAY,kCAC1C,GAAIqC,KAAKiH,OAAQ,CACf,IAAItP,EAAYqI,KAAKiH,OAAOK,aAAa1P,IAErCD,aAAS,EAATA,EAAWC,SAASD,aAAS,EAATA,EAAW0H,cAC3BW,KAAK0L,cAAc/T,KAGvBA,aAAS,EAATA,EAAWgU,kBACP3L,KAAK4L,aAAajU,EAAUgU,UAEtC,CACAhO,GACF,KACF,CAEM,aAAA+N,CAAcG,G,yCAClB,OAAO,IAAInO,SAAwBC,GAAY,kCACzCkO,GACFpV,OAAgB,SAAU,OAANA,aAAM,IAANA,YAAM,EAANA,OAAkB,UAAK,GAC3CA,OAAgB,QAAEqC,KAAK,CAAC,QAAS+S,EAAajU,MAAOiU,EAAaxM,OAKlE1B,GAAQ,IAGRA,GAAQ,EAEZ,KACF,G,CACM,YAAAiO,CAAaE,G,yCACjB,OAAO,IAAIpO,SAAwBC,GAAY,kCACzCmO,GACFrV,OAAgB,SAAU,OAANA,aAAM,IAANA,YAAM,EAANA,OAAkB,UAAK,GAC3CA,OAAgB,QAAEkV,SAAS,CACzB,MAASG,IAGXnO,GAAQ,IAGRA,GAAQ,EAEZ,KACF,G,MCDQoO,E,mxBA/CH,MAAMC,GACJ,EAAAC,MAAgB,QAChB,EAAAC,IAAc,MACd,EAAAC,QAAkB,UAEpB,MAAMhE,GACJ,EAAAiE,SAAmB,WACnB,EAAA9D,kBAA4B,oBAC5B,EAAA+D,aAAuB,eACvB,EAAAC,gBAA0B,kBAC1B,EAAAlE,iBAAmB,mBACnB,EAAAmE,YAAc,cACd,EAAAlE,kBAAoB,oBACpB,EAAAmE,aAAe,eACf,EAAAC,UAAoB,YACpB,EAAAC,eAAyB,iBACzB,EAAAC,gBAA0B,kBAC1B,EAAAC,gBAA0B,kBAC1B,EAAAC,kBAA4B,oBAC5B,EAAAC,gBAA0B,kBAC1B,EAAAC,kBAA4B,oBAC5B,EAAAC,eAAyB,iBACzB,EAAAC,SAAmB,WACnB,EAAAC,UAAoB,YAGtB,MAAMC,GACJ,EAAAC,oBAAsB,6BACtB,EAAAC,cAAgB,sBAGlB,MAAM/H,GACJ,EAAAgI,aAAe,iBACf,EAAAnI,UAAY,cACZ,EAAAK,SAAW,aACX,EAAAD,OAAS,WACT,EAAAa,kBAAoB,sBACpB,EAAAR,SAAW,WACX,EAAAD,cAAgB,gBAChB,EAAAD,UAAY,YACZ,EAAAO,gBAAkB,oBAClB,EAAAJ,UAAY,cACZ,EAAAY,eAAiB,wBACjB,EAAAe,4BAA8B,+BAC9B,EAAAE,yBAA2B,6BAGpC,SAAUqE,IAAO,SAAAwB,GAEf,MAAaC,EAUX,WAAAC,CAAYC,GATJ,KAAAC,eAAoD,IAAIC,IACxD,KAAAC,iBAA6B,GAM7B,KAAAC,WAAqB,EAG3BN,EAAmBO,SAAW/N,KAC9BwN,EAAmBO,SAASC,YAAc3C,EAASC,gBAAgBH,EAAaC,eAChF3U,OAAOwX,yBAA2BjO,KAE7BwN,EAAmBO,SAASC,cAEjCrN,EAAgB2B,iBAAiBnJ,SAAQyJ,IACvC,IAAIsL,EACJ,OAAQtL,EAAQxD,KAAKjI,eACnB,KAAK6U,EAAaC,MAChBiC,EAAgB,IAAItH,EACpB,MAEF,KAAKoF,EAAaG,QAChB+B,EAAgB,IAAIzC,EACpB,MAEF,KAAKO,EAAaE,IAChBgC,EAAgB,IAAI1E,EAIpB0E,IACFA,EAAclH,WAAW0G,EAAa/N,IAAIiD,EAAQxD,OAClDY,KAAK2N,eAAe/N,IAAIgD,EAAQxD,KAAM8O,GACxC,IAGF3E,EAAkBW,IAAI,CACpBhR,KAAM,2BAGRsU,EAAmBW,oBAAoBC,MAAK,KAC1CZ,EAAmBa,YAAYD,MAAK,KAC9BzN,EAAgBwB,qCAClBqL,EAAmBc,kCACnBd,EAAmBe,wBAEjB5N,EAAgByB,mCAClBoL,EAAmBgB,iCAErBhB,EAAmBiB,kCACnBhY,OAAOkC,iBAAiB,QAAS6U,EAAmBkB,mBACpDlB,EAAmBO,SAASD,WAAY,CAAI,GAC5C,IAEN,CAEA,gBAAaO,G,yCACX,OAAO,IAAI3Q,SAAqBC,GAAY,kC,YACtCgR,EAAe,EAAQ,qDAK3B,GAJIA,GACFA,EAAa/R,SAGV+D,EAAgBiE,YAArB,C,IAIA,IAA0B,IAAwB,EAAxB,SAAAjE,EAAgBsB,YAAQ,gCAAE,CAA1B,eAAf,MAAMrK,EAAK,QACd4V,EAAmBoB,SAAShX,EACpC,C,qGAEA+I,EAAgBuB,cAChBvE,GANA,MAFEA,GASJ,KACF,G,CAEA,wBAAawQ,G,yCACX,OAAO,IAAIzQ,SAAeC,GAAY,kCACpC,IAA4D,IAAxDgD,EAAgBkC,gBAAgBmJ,EAAaC,OAAjD,CAIA,IAAI4C,EAAezJ,aAAaC,QAAQC,EAAiBgI,cACpDuB,IACHzJ,aAAaiB,QAAQf,EAAiBgI,aAAc,IAAIxC,KAAKA,KAAKD,OAAOiE,eACzED,EAAezJ,aAAaC,QAAQC,EAAiBgI,oBAC/CE,EAAmBJ,4BACnBI,EAAmBuB,wBACzBpR,KAGF,IAAIqR,EAAY,IAAIlE,KAAK+D,GACrBhE,EAAM,IAAIC,KAAKA,KAAKD,OAEpBoE,GAAQD,EAAUE,UAAYrE,EAAIqE,WAAa,IAInD,GAHAD,GAAQ,GACajQ,KAAKmQ,IAAInQ,KAAKoQ,MAAMH,KAEnB,GAAI,CACxB,IAAII,EAAejK,aAAaC,QAAQC,EAAiBH,iBACnDqI,EAAmBJ,sBAErBiC,GADejK,aAAaC,QAAQC,EAAiBH,mBAEjDqI,EAAmBuB,wBAE7B,CAEA3J,aAAaiB,QAAQf,EAAiBgI,aAAc,IAAIxC,KAAKA,KAAKD,OAAOiE,eAEzEnR,GA5BA,MAFEA,GA+BJ,KACF,G,CAEA,0BAAayP,G,yCACX,OAAO,IAAI1P,SAAeC,GAAY,kCAEpCgD,EAAgB4F,kBAAiB,GAEjC,MAAM+I,QAAiBC,MAAM,8BAE7B,IAAKD,EAASE,GAeZ,OAduB,KAAnBF,EAASG,QAAoC,KAAnBH,EAASG,QACrC9O,EAAgB4F,kBAAiB,GAGnCnB,aAAaiB,QAAQf,EAAiBH,UAAW,MACjDC,aAAaiB,QAAQf,EAAiBE,SAAU,MAChDJ,aAAaiB,QAAQf,EAAiBC,OAAQ,MAC9CH,aAAaiB,QAAQf,EAAiBI,UAAW,MACjDN,aAAaiB,QAAQf,EAAiBK,cAAe,MACrDP,aAAaiB,QAAQf,EAAiBM,SAAU,MAChDR,aAAaiB,QAAQf,EAAiBW,gBAAiB,MACvDb,aAAaiB,QAAQf,EAAiBO,UAAW,WAEjDlI,GAAQ,GAIV,IAAI+R,QAAuBJ,EAASK,OAEpCvK,aAAaiB,QAAQf,EAAiBH,UAAWuK,EAAeE,WAChExK,aAAaiB,QAAQf,EAAiBE,SAAUkK,EAAeG,UAC/DzK,aAAaiB,QAAQf,EAAiBC,OAAQmK,EAAexJ,QAC7Dd,aAAaiB,QAAQf,EAAiBI,UAAWgK,EAAeI,WAChE1K,aAAaiB,QAAQf,EAAiBK,cAAe+J,EAAeK,eACpE3K,aAAaiB,QAAQf,EAAiBM,SAAU8J,EAAeM,UAC/D5K,aAAaiB,QAAQf,EAAiBW,gBAAiByJ,EAAeO,iBACtE7K,aAAaiB,QAAQf,EAAiBO,UAAW6J,EAAeQ,WAIpDR,EAAeG,SACdH,EAAeE,UAClBF,EAAexJ,OACZwJ,EAAeI,UACXJ,EAAeK,cACpBL,EAAeM,SACdN,EAAeQ,UAE5BvS,GAAQ,EACV,KACF,G,CAEA,oBAAO0P,GACL1M,EAAgB4F,kBAAiB,EACnC,CAEA,0BAAO4J,CAAoBrG,GAEzB,OADmBA,EAAQzK,KACN8N,SACnB,KAAKA,EAAQC,oBACXI,EAAmBJ,sBACnB,MAEF,KAAKD,EAAQE,cACXG,EAAmBH,gBAIzB,CAEA,4BAAO0B,GACL,OAAO,IAAIrR,SAAqBC,GAAY,kCAC1C,IAAI+R,EAAuC/O,EAAgBuE,yBACvDkL,EAA8B,CAChCC,QAAS,cACTC,SAAU3P,EAAgBkB,WAAWmD,aACrCS,UAAWiK,EAAejK,UAC1BE,cAAe+J,EAAe/J,cAC9BC,SAAU8J,EAAe9J,SACzB2K,cAAe5P,EAAgBmF,iBAAgB,GAC/C0K,SAAUra,SAASsa,SACnBC,KAAMja,OAAOka,SAASC,SACtBC,UAAWpa,OAAO0S,UAAU2H,UAC5BtL,SAAUkK,EAAelK,SACzBL,UAAWuK,EAAevK,UAC1BI,OAAQmK,EAAenK,OACvBwL,UAAWrB,EAAenK,QAGxByL,EAAoC,CACtCtZ,UAAWyQ,EAAW6E,eACtB3N,KAAM+Q,SAGF5C,EAAmBoB,SAASoC,GAClCrT,GACF,KACF,CAEA,2BAAO4Q,GACL,IAAI0C,EAAU,CACZC,WAAW,EACXC,SAAS,EACTpW,YAAY,EACZqW,eAAe,GAGbC,EAAUlb,SAASE,iBAAiB,uDACxCmX,EAAmBO,SAASuD,iBAAmB,IAAIC,iBAAiBvR,KAAKwR,gBACzEH,EAAQlY,SAAQgB,GAAUqT,EAAmBO,SAASuD,iBAAiBG,QAAQtX,EAAQ8W,IACzF,CAEA,qBAAOO,CAAeE,GACpBA,EAAUvY,SAAQwY,IAChBnE,EAAmBoE,uBAAuB,GAE9C,CAEA,2BAAOC,CAAqBH,GAC1BA,EAAUvY,SAAQwY,IAChBnE,EAAmBsE,sBAAsB,GAE7C,CAEA,sCAAOxD,GAMLd,EAAmBO,SAASgE,qBAAuB,IAAIC,qBAAqBhS,KAAKiS,oBALnE,CACZC,KAAM,KACNC,WAAY,MACZC,UAAW,KAGCjc,SAASE,iBAAiB,wBAChC8C,SAAQgB,GAAUqT,EAAmBO,SAASgE,qBAAqBN,QAAQtX,IACrF,CAEA,qCAAOqU,GAMLhB,EAAmBO,SAASsE,2BAA6B,IAAIL,qBAAqBhS,KAAKsS,sBALzE,CACZJ,KAAM,KACNC,WAAY,MACZC,UAAW,KAGOjc,SAASE,iBAAiB,uBAChC8C,SAAQgB,GAAUqT,EAAmBO,SAASsE,2BAA2BZ,QAAQtX,IACjG,CAEA,sCAAOsU,GAMLjB,EAAmBO,SAASsE,2BAA6B,IAAIL,qBAAqBhS,KAAKuS,yBALzE,CACZL,KAAM,KACNC,WAAY,MACZC,UAAW,KAGOjc,SAASE,iBAAiB,wBAChC8C,SAAQgB,GAAUqT,EAAmBO,SAASsE,2BAA2BZ,QAAQtX,IACjG,CAEA,4BAAOyX,GACLpE,EAAmBO,SAASgE,qBAAqBS,aACnCrc,SAASE,iBAAiB,wBAChC8C,SAAQgB,GAAUqT,EAAmBO,SAASgE,qBAAqBN,QAAQtX,IACrF,CAEA,2BAAO2X,GACLtE,EAAmBO,SAASsE,2BAA2BG,aACzCrc,SAASE,iBAAiB,uBAChC8C,SAAQgB,GAAUqT,EAAmBO,SAASsE,2BAA2BZ,QAAQtX,IAC3F,CAEA,0BAAO8X,CAAoBQ,EAAsCC,GAC/D,IAAIC,EAA4B,GAC5BC,EAAuC,GACvCC,EAAoB,GACpBC,EAA8B,GAoDlC,GAlDAL,EAAQtZ,SAAQ4Z,I,MACd,GAAIA,EAAMC,eAAgB,CAGxB,GAFAxF,EAAmBO,SAASgE,qBAAqBkB,UAAUF,EAAM5Y,UAC2C,SAArE4Y,EAAM5Y,OAAO+Y,aAAa,yBAAyB/b,eACnD,OAGvC,IAAIgc,EAAoBJ,EAAM5Y,OAAO+Y,aAAa,yBAE9CE,EAAoBL,EAAM5Y,OAAO+Y,aAAa,yBAC9CG,EAAuBN,EAAM5Y,OAAO+Y,aAAa,gCACjDI,EAAqG,UAApB,QAA7D,EAAAP,EAAM5Y,OAAO+Y,aAAa,2CAAmC,eAAE/b,eAEvF,GAAIgc,GAAqBC,GACvB,IAAK5F,EAAmBO,SAASF,iBAAiBtF,SAAS6K,GAAoB,CAC7E5F,EAAmBO,SAASF,iBAAiB/U,KAAKsa,GAClD7J,EAAkBW,IAAI,CACpBhR,KAAM,oBACN4Q,QAAS,YAAaqJ,0BAA0CE,UAChElZ,OAAQ4Y,EAAM5Y,SAEhBwY,EAAgB7Z,KAAKqa,GACrBP,EAA2B9Z,KAAKua,GAChCP,EAAiBha,KAAKwa,GAEtB,IADA,IAAIC,EAAOR,EAAM5Y,SAGf,IADAoZ,EAAOA,EAAKC,eACHhI,aAAa,mBAAoB,CACxC,IAAIiI,EAASF,EAAKL,aAAa,kBAC/B,GAAIO,EAAQ,CACVZ,EAAQ/Z,KAAK2a,GACb,KACF,CACF,MACK,GAAqB,QAAjBF,EAAKG,SAAoB,CAChCb,EAAQ/Z,KAAK,MACb,KACF,CAEJ,OAGAyQ,EAAkBW,IAAI,CACpBhR,KAAM,QACN4Q,QAAS,uDAGf,KAGE6I,EAAgBra,OAAS,EAAG,CAC9B,IAAIV,EAAsB,CACxBF,UAAWyQ,EAAWG,kBACtBjJ,KAAM,CACJsU,mBAAoBhB,EACpBiB,eAAgBhB,EAChBC,QAASA,EACTC,qBAGJtF,EAAmBoB,SAAShX,EAC9B,CACF,CAEA,4BAAO0a,CAAsBG,EAAsCC,GACjE,IAAImB,EAAsB,GAC1BpB,EAAQtZ,SAAQ4Z,IACd,GAAIA,EAAMC,eAAgB,CAGxB,GAFAxF,EAAmBO,SAASsE,2BAA2BY,UAAUF,EAAM5Y,UACqC,SAArE4Y,EAAM5Y,OAAO+Y,aAAa,yBAAyB/b,eACnD,OACvC,IAAI2c,EAAmBf,EAAM5Y,OAAO+Y,aAAa,wBAC7CY,EACGtG,EAAmBO,SAASF,iBAAiBtF,SAASuL,KACzDtG,EAAmBO,SAASF,iBAAiB/U,KAAKgb,GAClDvK,EAAkBW,IAAI,CACpBhR,KAAM,mBACN4Q,QAAU,WAAagK,EAAmB,WAE5CD,EAAU/a,KAAKgb,IAIjBvK,EAAkBW,IAAI,CACpBhR,KAAM,QACN4Q,QAAS,qDAGf,KAGE+J,EAAUvb,OAAS,GACrBub,EAAU1a,SAAQ2F,IAChB,IAAIlH,EAAsB,CACxBF,UAAWyQ,EAAWC,iBACtB/I,KAAM,CAAEyU,iBAAkBhV,IAE5B0O,EAAmBoB,SAAShX,EAAM,GAGxC,CAEA,+BAAO2a,CAAyBE,EAAsCC,GACpE,IAAIqB,EAAgC,GACpCtB,EAAQtZ,SAAQ4Z,I,MACd,GAAIA,EAAMC,eAAgB,CAExB,KAD6G,UAApB,QAAlD,EAAAD,EAAM5Y,OAAO+Y,aAAa,gCAAwB,eAAE/b,gBACpD,OAEvC,IAAIic,EAAoBL,EAAM5Y,OAAO+Y,aAAa,iBAClD,GAAIE,EAAmB,CAED,IADiE,SAAlEL,EAAM5Y,OAAO+Y,aAAa,sBAAsB/b,iBAEjEqW,EAAmBO,SAASsE,2BAA2BY,UAAUF,EAAM5Y,QAClEqT,EAAmBO,SAASF,iBAAiBtF,SAAS6K,IACzD5F,EAAmBO,SAASF,iBAAiB/U,KAAKsa,IAItD,IAAIY,EAAYjB,EAAM5Y,OAAO+Y,aAAa,mBACtCe,EAAa,IAAIrG,IAErB,IAAK,MAAMsG,KAAanB,EAAM5Y,OAAOga,oBACnC,GAAID,EAAUhd,WAAW,wBAAyB,CAChD,MAAM8D,EAAQ+X,EAAM5Y,OAAO+Y,aAAagB,GACxC,IAAInU,EAAMmU,EAAUjR,QAAQ,uBAAwB,IACpDgR,EAAWrU,IAAIG,EAAK/E,EACtB,CAGF+Y,EAASjb,KAAK,CACZsb,GAAIhB,EACJiB,KAAML,EACNM,WAAYL,IAGd1K,EAAkBW,IAAI,CACpBhR,KAAM,oBACN4Q,QAAU,YAAcsJ,EAAoB,UAGhD,MAEE7J,EAAkBW,IAAI,CACpBhR,KAAM,QACN4Q,QAAS,0DAGf,KAGEiK,EAASzb,OAAS,GACpByb,EAAS5a,SAAQ5C,IACf,IAAIqB,EAAsB,CACxBF,UAAWyQ,EAAWE,kBACtBhJ,KAAM9I,GAERiX,EAAmBoB,SAAShX,EAAM,GAGxC,CAEA,wBAAO8W,CAAkB9W,GACvB,GAAiC,MAA7BA,EAAMuC,OAAOoa,QAAQ,KAAc,CACrC,IACIC,GADAjB,EAAO3b,EAAMuC,OAAOoa,QAAQ,MACXE,KACrB,GAA4C,MAAxClB,EAAKgB,QAAQ,wBAEf,YADA/G,EAAmBkH,kBAAkB9c,EAAO2b,EAAMiB,GAG/C,GAA2C,MAAvCjB,EAAKgB,QAAQ,uBAEpB,YADA/G,EAAmBmH,iBAAiB/c,EAAO2b,EAAMiB,GAG9C,GAA4C,MAAxCjB,EAAKgB,QAAQ,wBAEpB,YADA/G,EAAmBoH,kBAAkBhd,EAAO2b,EAAMiB,EAGtD,KACK,CACH,IAAIjB,EACJ,GAA4C,OADxCA,EAAO3b,EAAMuC,QACRoa,QAAQ,wBAEf,YADA/G,EAAmBoH,kBAAkBhd,EAAO2b,EAGhD,CACF,CAEA,wBAAOmB,CAAkB9c,EAAY2b,EAAWiB,G,MAG9C,GAD0F,UAD1FjB,EAAOA,EAAKgB,QAAQ,yBACmBrB,aAAa,oBAAoB/b,cACvC,CAC/BS,EAAMid,kBACNjd,EAAMkd,iBAEN,IAAIzB,EAAuBE,EAAKL,aAAa,gCACzCpP,EAAYyP,EAAKL,aAAa,yBAC9BI,EAA6F,UAApB,QAArD,EAAAC,EAAKL,aAAa,2CAAmC,eAAE/b,eAE/E,GAAI2M,EAAW,CAEb,IADA,IAAID,EAEF0P,EAAOA,EAAKC,eADD,CAKX,GAAID,EAAK/H,aAAa,mBAAoB,CACxC3H,EAAW0P,EAAKL,aAAa,kBAC7B,KACF,CACK,GAAqB,QAAjBK,EAAKG,SAAoB,CAChC7P,EAAW,KACX,KACF,CACF,CAEA,IAAIjM,EAAsB,CACxBF,UAAWyQ,EAAWkE,aACtBhN,KAAM,CACJ8T,kBAAmBrP,EACnBiR,cAAe1B,EACfxP,SAAUA,EACVyP,kBAAmBA,IAGvB9F,EAAmBoB,SAAShX,GAC5BnB,OAAOka,SAAW6D,CACpB,MAGE/d,OAAOka,SAAW6D,CAEtB,CACF,CAEA,uBAAOG,CAAiB/c,EAAY2b,EAAWiB,GAG7C,GAD0F,UAD1FjB,EAAOA,EAAKgB,QAAQ,wBACmBrB,aAAa,oBAAoB/b,cACvC,CAC/BS,EAAMid,kBACNjd,EAAMkd,iBAEN,IAAIE,EAAWzB,EAAKL,aAAa,wBACjC,GAAI8B,EAAU,CACZ,IAAIpd,EAAsB,CACxBF,UAAWyQ,EAAWoE,YACtBlN,KAAM,CACJyU,iBAAkBkB,IAGtBxH,EAAmBoB,SAAShX,GAC5BnB,OAAOka,SAAW6D,CACpB,MAGE/d,OAAOka,SAAW6D,CAEtB,CACF,CAEA,wBAAOI,CAAkBhd,EAAY2b,EAAWiB,G,QAG9C,GADiG,QAA/D,EAAyD,UAApB,QAArC,GADlCjB,EAAOA,EAAKgB,QAAQ,yBACmBrB,aAAa,2BAAmB,eAAE/b,sBAAwB,SAChE,CAE3Bqd,IACF5c,EAAMid,kBACNjd,EAAMkd,kBAGR,IAAIG,EAAY1B,EAAKL,aAAa,iBAElC,GAAI+B,EAAW,CACb,IAAIjB,EAAYT,EAAKL,aAAa,mBAC9Be,EAAa,IAAIrG,IAErB,IAAK,MAAMsG,KAAaX,EAAKY,oBAC3B,GAAID,EAAUhd,WAAW,wBAAyB,CAChD,MAAM8D,EAAQuY,EAAKL,aAAagB,GAChC,IAAInU,EAAMmU,EAAUjR,QAAQ,uBAAwB,IACpDgR,EAAWrU,IAAIG,EAAK/E,EACtB,CAGF,IAAIqE,EAA0B,CAC5B+U,GAAIa,EACJZ,KAAML,EACNM,WAAYL,GAGd,IAAIrc,EAAsB,CACxBF,UAAWyQ,EAAWqE,aACtBnN,QAGFmO,EAAmBoB,SAAShX,GAER2b,EAAK2B,QAAqB,aAC7B3B,EAAK4B,gBAAgB,sBAElCX,IACF/d,OAAOka,SAAW6D,EAEtB,MACSA,IAEP/d,OAAOka,SAAW6D,EAEtB,CACF,CAEA,yBAAOY,GACL,IAAIrH,EAQJ,OAPIP,EAAmBO,SACrBA,EAAWP,EAAmBO,SAEvBtX,OAAOwX,2BACdF,EAAWtX,OAAOwX,0BAGbF,CACT,CAEA,eAAOa,CAAShX,GACd,OAAO,IAAI8F,SAAqBC,GAAY,kC,cACtC0X,EAAuB,GACvBC,EAAS,IAAI1H,I,IACjB,IAA4B,IAAgC,EAAhC,SAAAjN,EAAgB2B,oBAAgB,gCAAE,CAAlC,eAAjB,MAAMM,EAAO,EACtB,GAAIjC,EAAgBoC,cAAcH,EAAQxD,KAAMxH,EAAMF,WACpD,IACE,IAAIqW,EAAWP,EAAmB4H,2BAEa,QAAzC,EAAArH,EAASJ,eAAehO,IAAIiD,EAAQxD,aAAK,eAAEiI,cAAczP,GAC/Dyd,EAAqBvc,KAAK8J,EAAQxD,KAEpC,CACA,MAAOhB,GACLkX,EAAO1V,IAAIgD,EAAQxD,KAAMxH,EAAMF,UAEjC,CAEJ,C,qGAEA6R,EAAkBoB,kBAAkB/S,GAEhCyd,EAAqB/c,OAAS,EAChCiR,EAAkBW,IAAI,CAAEhR,KAAM,QAAS4Q,QAAS,UAAUlS,EAAMF,6BAA6B2d,EAAqBE,KAAK,UAEvHhM,EAAkBW,IAAI,CAAEhR,KAAM,QAAS4Q,QAAS,UAAUlS,EAAMF,wDAElE4d,EAAOnc,SAAQ,CAAC6B,EAAO+E,KACrBwJ,EAAkBW,IAAI,CAAEhR,KAAM,QAAS4Q,QAAS,wCAAwC9O,UAAc+E,KAAQ,IAGhHpC,GACF,KACF,CAEA,2BAAa6X,CAAqBC,G,yCAChC,OAAO,IAAI/X,SAAeC,GAAY,kC,MAChCoQ,EAAWP,EAAmB4H,sBAC9BrH,aAAQ,EAARA,EAAUD,mBACNN,EAAmBW,qBACH,QAAlB,EAAAsH,aAAY,EAAZA,EAAcpW,YAAI,eAAEqW,cACtBnM,EAAkBW,IAAI,CACpBJ,QAAS,yCAGXnJ,EAAgBC,oBAAoB6U,EAAapW,KAAKqW,YAEtDnM,EAAkBW,IAAI,CACpBhR,KAAM,iCAEFsU,EAAmBa,cAG7B1Q,GACF,KACF,G,CAEA,gBAAOgY,CAAUrP,GACf,IAAIxP,EAAS,CAAC,EAKd,OAJAX,SAASW,OAAOC,MAAM,KAAKoC,SAAQ,SAAU0C,GAC3C,IAAKkE,EAAK/E,GAASa,EAAG9E,MAAM,KAC5BD,EAAOiJ,EAAI9I,QAAU+D,CACvB,IACOlE,EAAOwP,EAChB,EApqBW,EAAAkH,mBAAkB,CAuqBhC,CAzqBgB,GAAAD,UAAA,EAAAA,QAAO,IAyqBvB,CAzqBD,CAAUxB,IAAAA,EAAM,KA2qBhB,QAAeA,EAAc,QCtsBtB,MAAM6J,GACX,YAAAtO,CAAa1P,GACX,IAAIie,EAEJ,OAAQje,EAAMF,UAAUP,eACtB,KAAKgR,EAAWG,kBACduN,EAAc7V,KAAK8V,kBAAkBle,GACrC,MAEF,KAAKuQ,EAAWkE,aACdwJ,EAAc7V,KAAK+V,gBAAgBne,GACnC,MAEF,KAAKuQ,EAAWmE,gBACduJ,EAAc7V,KAAKgW,cAAcpe,GACjC,MAEF,KAAKuQ,EAAWC,iBACdyN,EAAc7V,KAAKiW,mBAAmBre,GACtC,MAEF,KAAKuQ,EAAWoE,YACdsJ,EAAc7V,KAAKkW,2BAA2Bte,GAC9C,MAEF,KAAKuQ,EAAWsE,UACdoJ,EAAc7V,KAAKmW,eAAeve,GAClC,MAEF,KAAKuQ,EAAWuE,eACdmJ,EAAc7V,KAAKoW,oBAAoBxe,GACvC,MAEF,KAAKuQ,EAAWyE,gBACdiJ,EAAc7V,KAAKqW,qBAAqBze,GACxC,MAEF,KAAKuQ,EAAW4E,kBACd8I,EAAc7V,KAAKsW,uBAAuB1e,GAC1C,MAEF,KAAKuQ,EAAW0E,kBACdgJ,EAAc7V,KAAKuW,uBAAuB3e,GAC1C,MAEF,KAAKuQ,EAAWE,kBACgC,eAAzCzQ,EAAMyH,KAA2BgV,OACpCwB,EAAc7V,KAAKwW,cAAc5e,IAEnC,MAEF,KAAKuQ,EAAWqE,aACgC,qBAAzC5U,EAAMyH,KAA2BgV,OACpCwB,EAAc7V,KAAKyW,mBAAmB7e,IAM5C,OAAOie,CACT,CAEA,iBAAAC,CAAkBle,GAChB,IAAKA,EAAMyH,KAAKsU,mBAAoB,MAAM,IAAI+C,MAAM,+BACpD,IAAK9e,EAAMyH,KAAKuU,eAAgB,MAAM,IAAI8C,MAAM,oCAChD,GAAI9e,EAAMyH,KAAKuU,eAAetb,QAAUV,EAAMyH,KAAKsU,mBAAmBrb,OAAQ,MAAM,IAAIoe,MAAM,4DAC9F,MAAMC,EAAqB,GACrBC,EAAWjW,EAAgBkB,WAC3BgV,EAA4B,GAC5BC,EAA+B,GAErC,IAAK,IAAIze,EAAI,EAAGA,EAAIT,EAAMyH,KAAKsU,mBAAmBrb,OAAQD,IACxDse,EAAS7d,KAAKlB,EAAMyH,KAAKsU,mBAAmBtb,GAAK,IAAMT,EAAMyH,KAAKuU,eAAevb,IAGnF,MAAM0e,EAAgBpW,EAAgB0C,SAA0BzL,EAAMyH,KAAKsU,oBACrEqD,EAAcrW,EAAgBwD,uBAAuBwS,GAE3D,IAAK,IAAIte,EAAI,EAAGA,EAAI0e,EAAcze,OAAQD,IAAK,CAC7C,MAAM0I,EAAUgW,EAAc1e,GACxB4e,EAAiBD,EAAY3e,GAE7BiH,EAAQyX,EAAc9S,QAAQlD,GAC9BmW,EAAmBvW,EAAgBiD,mBAAmBhM,EAAMyH,KAAKwT,QAAQvT,GAAQyB,EAAQqT,IAAM,EAErG,IAAIzc,EAAY,CACdwf,SAAU,KACVC,QAAS,KACTC,OAAQ,KACRlW,MAAO8V,aAAc,EAAdA,EAAgBK,WACvBhY,MAAO4X,EACPK,eAAgB3f,EAAMyH,KAAKwT,QAAQvT,GACnCkY,aAAc,KACdC,QAAS1W,EAAQqT,GACjBsD,UAAW3W,EAAQ4W,YACnBC,WAAY7W,EAAQ8W,MACpBC,cAAe/W,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACvEC,eAAgBjX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEE,eAAgBlX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEG,eAAgBnX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEI,eAAgBpX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEK,SAAU,EACVC,WAAYtX,EAAQuX,QACpBC,UAAWxX,EAAQyX,OACnBC,gBAAiB1X,EAAQ2X,YACzBC,YAAa1B,aAAc,EAAdA,EAAgB2B,UAG/B/B,EAAmB/d,KAAKnB,GAEpBC,EAAMyH,KAAKyT,iBAAiBza,IAC9Bye,EAAsBhe,KAAKnB,EAE/B,CAEA,MAAMkhB,EAAU,CACdjhB,MAAO,iBACP+R,UAAW,CACTmP,SAAUlC,EAAS5R,aACnB+T,MAAOlC,EACPmC,aAAchZ,KAAKiZ,iBAKvB,GAAInC,EAAsBxe,OAAS,EAAG,CAUpC,MAAO,CAACugB,EATgB,CACtBjhB,MAAO,iBACP+R,UAAW,CACTmP,SAAUlC,EAAS5R,aACnB+T,MAAOjC,EACPkC,aAAchZ,KAAKiZ,iBAKzB,CACE,OAAOJ,CAEX,CAEA,eAAA9C,CAAgBne,GACd,IAAKA,EAAMyH,KAAK8T,kBAAmB,MAAM,IAAIuD,MAAM,8BAEnD,MAAM3V,EAAUJ,EAAgBuC,QAAyBtL,EAAMyH,KAAK8T,mBAC9D8D,EAAiBtW,EAAgBuD,sBAAsBtM,EAAMyH,KAAK8T,kBAAoB,IAAMvb,EAAMyH,KAAK0V,eACvGmC,EAAmBvW,EAAgBiD,mBAAmBhM,EAAMyH,KAAKwE,SAAU9C,EAAQqT,IACnFwC,EAAWjW,EAAgBkB,WAC3BqX,EAAiB,GAEvBA,EAAQpgB,KAAK,CACXqe,SAAU,KACVC,QAAS,KACTC,OAAQ,KACRlW,MAAO8V,aAAc,EAAdA,EAAgBK,WACvBhY,MAAO4X,EAAmB,EAC1BK,eAAgB3f,EAAMyH,KAAKwE,SAC3B2T,aAAc,KACdC,QAAS1W,EAAQqT,GACjBsD,UAAW3W,EAAQ4W,YACnBC,WAAY7W,EAAQ8W,MACpBC,cAAe/W,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACvEC,eAAgBjX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEE,eAAgBlX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEG,eAAgBnX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEI,eAAgBpX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEK,SAAU,EACVC,WAAYtX,EAAQuX,QACpBC,UAAWxX,EAAQyX,OACnBC,gBAAiB1X,EAAQ2X,YACzBC,YAAa1B,aAAc,EAAdA,EAAgB2B,WAG/B,MAAMC,EAAU,CACdjhB,MAAO,cACP+R,UAAW,CACTmP,SAAUlC,EAAS5R,aACnB+T,MAAOG,EACPF,aAAchZ,KAAKiZ,iBAKvB,GAAIrhB,EAAMyH,KAAKiU,kBAAmB,CAUhC,MAAO,CAACuF,EATmB,CACzBjhB,MAAO,mBACP+R,UAAW,CACTmP,SAAUlC,EAAS5R,aACnB+T,MAAOG,EACPF,aAAchZ,KAAKiZ,iBAKzB,CACE,OAAOJ,CAEX,CAEA,aAAA7C,CAAcpe,GACZ,IAAKA,EAAMyH,KAAK8T,kBAAmB,MAAM,IAAIuD,MAAM,8BAEnD,MAAM3V,EAAUJ,EAAgBuC,QAAyBtL,EAAMyH,KAAK8T,mBAC9D8D,EAAiBtW,EAAgBuD,sBAAsBtM,EAAMyH,KAAK8T,kBAAoB,IAAMvb,EAAMyH,KAAK0V,eAEvG6B,EAAWjW,EAAgBkB,WAC3BsX,EAAkB,GAExBA,EAASrgB,KAAK,CACZqe,SAAU,KACVC,QAAS,KACTC,OAAQ,KACRlW,MAAO8V,aAAc,EAAdA,EAAgBK,WACvBhY,MAAO,KACP8Z,aAAc,KACd7B,eAAgB,KAChBC,aAAc,KACdC,QAAS1W,EAAQqT,GACjBsD,UAAW3W,EAAQ4W,YACnBC,WAAY7W,EAAQ8W,MACpBC,cAAe/W,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACvEC,eAAgBjX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEE,eAAgBlX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEG,eAAgBnX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEI,eAAgBpX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEK,SAAU,EACVC,WAAYtX,EAAQuX,QACpBC,UAAWxX,EAAQyX,OACnBC,gBAAiB1X,EAAQ2X,YACzBC,YAAa1B,aAAc,EAAdA,EAAgB2B,WAa/B,MAVgB,CACdhhB,MAAO,YACP+R,UAAW,CACTmP,SAAUlC,EAAS5R,aACnBhK,MAAOic,aAAc,EAAdA,EAAgBK,WACvByB,MAAOI,EACPH,aAAchZ,KAAKiZ,gBAKzB,CACA,kBAAAhD,CAAmBre,GACjB,IAAKA,EAAMyH,KAAKyU,iBAAkB,MAAM,IAAI4C,MAAM,6BAElD,MAAM2C,EAAS1Y,EAAgB2D,OAAO1M,EAAMyH,KAAKyU,kBAC3CqF,EAAkB,GAExBA,EAASrgB,KAAK,CACZwgB,aAAcD,EAAOjF,GACrBmF,eAAgBF,EAAO1B,YACvBS,SAAU,EACVoB,WAAYH,EAAOI,QACnBC,WAAYL,EAAOM,QACnBC,cAAe,KACfC,cAAe,KACf1C,SAAU,KACVE,OAAQ,KACRlW,MAAO,KACPoW,eAAgB,KAChBC,aAAc,KACdC,QAAS,KACTC,UAAW,KACXE,WAAY,KACZE,cAAe,KACfE,eAAgB,KAChBC,eAAgB,KAChBC,eAAgB,KAChBC,eAAgB,OAWlB,MARgB,CACdvgB,MAAO,iBACP+R,UAAW,CACToP,MAAOI,EACPH,aAAchZ,KAAKiZ,gBAKzB,CAEA,0BAAA/C,CAA2Bte,GACzB,IAAKA,EAAMyH,KAAKyU,iBAAkB,MAAM,IAAI4C,MAAM,6BAElD,MAAM2C,EAAS1Y,EAAgB2D,OAAO1M,EAAMyH,KAAKyU,kBAC3CqF,EAAkB,GAExBA,EAASrgB,KAAK,CACZwgB,aAAcD,EAAOjF,GACrBmF,eAAgBF,EAAO1B,YACvBS,SAAU,EACVoB,WAAYH,EAAOI,QACnBC,WAAYL,EAAOM,QACnBC,cAAe,KACfC,cAAe,KACf1C,SAAU,KACVE,OAAQ,KACRlW,MAAO,KACPoW,eAAgB,KAChBC,aAAc,KACdC,QAAS,KACTC,UAAW,KACXE,WAAY,KACZE,cAAe,KACfE,eAAgB,KAChBC,eAAgB,KAChBC,eAAgB,KAChBC,eAAgB,OAWlB,MARgB,CACdvgB,MAAO,mBACP+R,UAAW,CACToP,MAAOI,EACPH,aAAchZ,KAAKiZ,gBAKzB,CAEA,cAAA9C,CAAeve,GACb,IAAKA,EAAMyH,KAAK8T,kBAAmB,MAAM,IAAIuD,MAAM,8BAEnD,MAAM3V,EAAUJ,EAAgBuC,QAAyBtL,EAAMyH,KAAK8T,mBAC9D8D,EAAiBtW,EAAgBuD,sBAAsBtM,EAAMyH,KAAK8T,kBAAoB,IAAMvb,EAAMyH,KAAK0V,eAEvG6B,EAAWjW,EAAgBkB,WAC3BsX,EAAkB,GAExB,IAAI1F,EAASzT,KAAK8Z,OAAOliB,EAAMyH,KAAKwE,SAAUjM,EAAMyH,KAAKoU,QAEzD0F,EAASrgB,KAAK,CACZqe,SAAU,KACVC,QAAS,KACTC,OAAQ,KACRlW,MAAO8V,aAAc,EAAdA,EAAgBK,WACvBhY,MAAO,KACPiY,eAAgB3f,EAAMyH,KAAKwE,SAC3BuV,aAAc3F,EACd+D,aAAc,KACdC,QAAS1W,EAAQqT,GACjBsD,UAAW3W,EAAQ4W,YACnBC,WAAY7W,EAAQ8W,MACpBC,cAAe/W,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACvEC,eAAgBjX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEE,eAAgBlX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEG,eAAgBnX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEI,eAAgBpX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEK,SAAUxgB,EAAMyH,KAAK+Y,SACrBC,WAAYtX,EAAQuX,QACpBC,UAAWxX,EAAQyX,OACnBC,gBAAiB1X,EAAQ2X,YACzBC,YAAa1B,aAAc,EAAdA,EAAgB2B,SAC7BmB,OAAQniB,EAAMyH,KAAKwE,WAarB,MAVgB,CACdjM,MAAO,cACP+R,UAAW,CACTmP,SAAUlC,EAAS5R,aACnBhK,OAAOic,aAAc,EAAdA,EAAgBK,YAAa1f,EAAMyH,KAAK+Y,SAC/CW,MAAOI,EACPH,aAAchZ,KAAKiZ,gBAKzB,CAEA,mBAAA7C,CAAoBxe,GAClB,IAAKA,EAAMyH,KAAK8T,kBAAmB,MAAM,IAAIuD,MAAM,8BAEnD,MAAM3V,EAAUJ,EAAgBuC,QAAyBtL,EAAMyH,KAAK8T,mBAC9D8D,EAAiBtW,EAAgBuD,sBAAsBtM,EAAMyH,KAAK8T,kBAAoB,IAAMvb,EAAMyH,KAAK0V,eACvG6B,EAAWjW,EAAgBkB,WAC3BsX,EAAkB,GAExBA,EAASrgB,KAAK,CACZqe,SAAU,KACVC,QAAS,KACTC,OAAQ,KACRlW,MAAO8V,aAAc,EAAdA,EAAgBK,WACvBhY,MAAO,KACPiY,eAAgB3f,EAAMyH,KAAKwE,SAC3B2T,aAAc,KACdC,QAAS1W,EAAQqT,GACjBsD,UAAW3W,EAAQ4W,YACnBC,WAAY7W,EAAQ8W,MACpBC,cAAe/W,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACvEC,eAAgBjX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEE,eAAgBlX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEG,eAAgBnX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEI,eAAgBpX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEK,SAAUxgB,EAAMyH,KAAK+Y,SACrBC,WAAYtX,EAAQuX,QACpBC,UAAWxX,EAAQyX,OACnBC,gBAAiB1X,EAAQ2X,YACzBC,YAAa1B,aAAc,EAAdA,EAAgB2B,WAa/B,MAVgB,CACdhhB,MAAO,mBACP+R,UAAW,CACTmP,SAAUlC,EAAS5R,aACnBhK,OAAOic,aAAc,EAAdA,EAAgBK,YAAa1f,EAAMyH,KAAK+Y,SAC/CW,MAAOI,EACPH,aAAchZ,KAAKiZ,gBAKzB,CAEA,oBAAA5C,CAAqBze,GACnB,IAAKA,EAAMyH,KAAK2a,kBAA0D,GAAtCpiB,EAAMyH,KAAK2a,iBAAiB1hB,OAAa,MAAM,IAAIoe,MAAM,qBAC7F,MAAMyC,EAAkB,GAClBvC,EAAWjW,EAAgBkB,WACjC,IAAI7G,EAAgB,EAEpBpD,EAAMyH,KAAK2a,iBAAiB7gB,SAAS8gB,IACnC,MAAMlZ,EAAUJ,EAAgBuC,QAAyB+W,EAAgB9G,mBACnE8D,EAAiBtW,EAAgBuD,sBAAsB+V,EAAgB9G,kBAAoB,IAAM8G,EAAgBlF,eAEvHoE,EAASrgB,KAAK,CACZqe,SAAU,KACVC,QAAS,KACTC,OAAQ,KACRlW,MAAO8V,aAAc,EAAdA,EAAgBK,WACvBhY,MAAO,KACPiY,eAAgB3f,EAAMyH,KAAKwE,SAC3B2T,aAAc,KACdC,QAAS1W,EAAQqT,GACjBsD,UAAW3W,EAAQ4W,YACnBC,WAAY7W,EAAQ8W,MACpBC,cAAe/W,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACvEC,eAAgBjX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEE,eAAgBlX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEG,eAAgBnX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEI,eAAgBpX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEK,SAAU6B,EAAgBC,IAC1B7B,WAAYtX,EAAQuX,QACpBC,UAAWxX,EAAQyX,OACnBC,gBAAiB1X,EAAQ2X,YACzBC,YAAa1B,aAAc,EAAdA,EAAgB2B,WAG/B5d,IAASic,aAAc,EAAdA,EAAgBK,YAAa2C,EAAgBC,GAAG,IAa3D,MAVgB,CACdtiB,MAAO,iBACP+R,UAAW,CACTmP,SAAUlC,EAAS5R,aACnBhK,MAAOA,EACP+d,MAAOI,EACPH,aAAchZ,KAAKiZ,gBAKzB,CAEA,sBAAA3C,CAAuB1e,G,MACrB,IAAKA,EAAMyH,KAAK2a,kBAA0D,GAAtCpiB,EAAMyH,KAAK2a,iBAAiB1hB,OAC9D,MAAM,IAAIoe,MAAM,qBAElB,MAAMyC,EAAkB,GAClBvC,EAAWjW,EAAgBkB,WAC3BsY,EAAexZ,EAAgBsE,cA/dU,qBAie/CrN,EAAMyH,KAAK2a,iBAAiB7gB,SAAS8gB,IACnC,MAAMlZ,EAAUJ,EAAgBuC,QAAyB+W,EAAgB9G,mBACnE8D,EAAiBtW,EAAgBuD,sBAAsB+V,EAAgB9G,kBAAoB,IAAM8G,EAAgBlF,eAEvHoE,EAASrgB,KAAK,CACZqe,SAAU,KACVC,QAAS,KACTC,OAAQ,KACRlW,MAAO8V,aAAc,EAAdA,EAAgBK,WACvBhY,MAAO,KACPiY,eAAgB,KAChBC,aAAc,KACdC,QAAS1W,EAAQqT,GACjBsD,UAAW3W,EAAQ4W,YACnBC,WAAY7W,EAAQ8W,MACpBC,cAAe/W,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACvEC,eAAgBjX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEE,eAAgBlX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEG,eAAgBnX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEI,eAAgBpX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEK,SAAU6B,EAAgBC,IAC1BE,iBAAkBrZ,EAAQsZ,aAC1BhC,WAAYtX,EAAQuX,QACpBC,UAAWxX,EAAQyX,OACnBC,gBAAiB1X,EAAQ2X,YACzBC,YAAa1B,aAAc,EAAdA,EAAgB2B,UAC7B,IAGJ,MAAMC,EAAU,CACdjhB,MAAO,oBACP+R,UAAW,CACTmP,SAAUlC,EAAS5R,aACnB+T,MAAOI,EACPmB,cAAiC,QAAlB,EAAAH,aAAY,EAAZA,EAAcI,YAAI,QAAI,UACrCvB,aAAchZ,KAAKiZ,iBASvB,MAAO,CAACJ,EALuB,OAAH,wBACvBA,GAAO,CACVjhB,MAAO,wBAIX,CAEA,sBAAA2e,CAAuB3e,GACrB,IAAKA,EAAMyH,KAAKmb,2BAA4E,GAA/C5iB,EAAMyH,KAAKmb,0BAA0BliB,OAAa,MAAM,IAAIoe,MAAM,qBAE/G,MAAM+D,EAAe7iB,EAAMyH,KAAKob,aAChC,IAAIC,EAAyB,GACzBD,IAAcC,EAAejb,OAAOkb,KAAKF,GAAcG,QAAQ7a,IAA8B,IAAtB0a,EAAa1a,MAExF,MAAMoZ,EAAkB,GAClBvC,EAAWjW,EAAgBkB,WAEjCjK,EAAMyH,KAAKmb,0BAA0BrhB,SAAS8gB,IAC5C,MAAMlZ,EAAUJ,EAAgBuC,QAAyB+W,EAAgB9G,mBACnE8D,EAAiBtW,EAAgBuD,sBAAsB+V,EAAgB9G,kBAAoB,IAAM8G,EAAgBlF,eACjH8F,EAAeZ,EAAgBY,aAErC1B,EAASrgB,KAAK,CACZqe,SAAU,KACVC,QAAS,KACTC,OAAQ,KACRlW,MAAO8V,aAAc,EAAdA,EAAgBK,WACvBhY,MAAO,KACPiY,eAAgB3f,EAAMyH,KAAKwE,SAC3B2T,aAAc,KACdC,QAAS1W,EAAQqT,GACjBsD,UAAW3W,EAAQ4W,YACnBC,WAAY7W,EAAQ8W,MACpBC,cAAe/W,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACvEC,eAAgBjX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEE,eAAgBlX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEG,eAAgBnX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEI,eAAgBpX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEK,SAAU6B,EAAgBC,IAC1B7B,WAAYtX,EAAQuX,QACpBC,UAAWxX,EAAQyX,OACnBC,gBAAiB1X,EAAQ2X,YACzBC,YAAa1B,aAAc,EAAdA,EAAgB2B,SAC7BkC,iBAAkBD,GAClB,IAiBJ,MAdgB,CACdjjB,MAAO,WACP+R,UAAW,CACToR,eAAgBnjB,EAAMyH,KAAK2b,oBAC3BhgB,MAAOpD,EAAMyH,KAAK4b,gBAClBC,IAAKtjB,EAAMyH,KAAK8b,eAChBC,SAAUxjB,EAAMyH,KAAK+b,SACrBtC,SAAUlC,EAAS5R,aACnB+T,MAAOI,EACPH,aAAchZ,KAAKiZ,eACnBoC,cAAeX,GAKrB,CAEA,aAAAlE,CAAc5e,GACZ,MAAMuhB,EAAkB,GAClBvC,EAAWjW,EAAgBkB,WAC3BT,EAAST,EAAgBkE,SAC/B,IAAI7J,EAAgB,EAEhBoG,GAAUA,EAAOka,MACnBla,EAAOka,KAAKniB,SAASoiB,IACnB,MAAMxa,EAAUJ,EAAgBuC,QAAyBqY,EAAIpI,mBACvD8D,EAAiBtW,EAAgBuD,sBAAsBqX,EAAIpI,kBAAoB,IAAMoI,EAAIxG,eAE/FoE,EAASrgB,KAAK,CACZqe,SAAU,KACVC,QAAS,KACTC,OAAQ,KACRlW,MAAO8V,aAAc,EAAdA,EAAgBK,WACvBhY,MAAO,KACPiY,eAAgB3f,EAAMyH,KAAKwE,SAC3B2T,aAAc,KACdC,QAAS1W,EAAQqT,GACjBsD,UAAW3W,EAAQ4W,YACnBC,WAAY7W,EAAQ8W,MACpBC,cAAe/W,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACvEC,eAAgBjX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEE,eAAgBlX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEG,eAAgBnX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEI,eAAgBpX,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW,GAAK,KACxEK,SAAUmD,EAAIrB,IACd7B,WAAYtX,EAAQuX,QACpBC,UAAWxX,EAAQyX,OACnBC,gBAAiB1X,EAAQ2X,YACzBC,YAAa1B,aAAc,EAAdA,EAAgB2B,WAG/B5d,IAASic,aAAc,EAAdA,EAAgBK,YAAaiE,EAAIrB,GAAG,IAcjD,MAVgB,CACdtiB,MAAO,YACP+R,UAAW,CACT3O,MAAOA,EACP8d,SAAUlC,EAAS5R,aACnB+T,MAAOI,EACPH,aAAchZ,KAAKiZ,gBAKzB,CAEA,kBAAAxC,CAAmB7e,G,MACjB,MAAMyH,EAAOzH,EAAMyH,KAWnB,MARgB,CACdzH,MAAO,oBACP+R,UAAW,CACT6R,qBALoE,QAApC,EAAAnc,aAAI,EAAJA,EAAMiV,WAAW3U,IAAI,uBAAe,QAAI,IAAI8b,cAM5EzC,aAAchZ,KAAKiZ,gBAKzB,CAEA,YAAAA,GACE,OAAO,IAAInO,MAAO4Q,aACpB,CAEA,MAAA5B,CAAOjW,EAAkB4P,GAIvB,OAHKA,GAAmC,IAAzBA,EAAOxc,OAAOqB,SAC3Bmb,EAAS5P,GAEJ4P,CACT,ECnqBK,MAAMkI,GAEX,YAAArU,CAAa1P,GACX,IAAIie,EAEJ,OAAQje,EAAMF,UAAUP,eACtB,KAAKgR,EAAW6E,eACd6I,EAAc7V,KAAK4b,yBAAyBhkB,GAC5C,MAEF,KAAKuQ,EAAWiE,SACdyJ,EAAc7V,KAAK6b,mBAAmBjkB,GACtC,MAEF,KAAKuQ,EAAWmE,gBACduJ,EAAc7V,KAAK8b,0BAA0BlkB,GAC7C,MAEF,KAAKuQ,EAAW2E,gBACd+I,EAAc7V,KAAK+b,0BAA0BnkB,GAC7C,MAEF,KAAKuQ,EAAWsE,UACV7U,EAAMyH,KAAK2c,iBACbnG,EAAc7V,KAAKic,sBAAsBrkB,GAGzC2R,EAAkBW,IAAI,CAAEhR,KAAM,UAAW4Q,QAAS,UAAUlS,EAAMF,qDAEpE,MAEF,KAAKyQ,EAAWuE,eACV9U,EAAMyH,KAAK6c,mBACbrG,EAAc7V,KAAKmc,2BAA2BvkB,GAG9C2R,EAAkBW,IAAI,CAAEhR,KAAM,UAAW4Q,QAAS,UAAUlS,EAAMF,qDAEpE,MAEF,KAAKyQ,EAAWwE,gBACdkJ,EAAc7V,KAAKoc,0BAA0BxkB,GAC7C,MAGF,KAAKuQ,EAAWG,kBACduN,EAAc7V,KAAKqc,6BAA6BzkB,GAKpD,OAAOie,CACT,CAEA,wBAAA+F,CAAyBhkB,GACvB,IAAIyH,EAAOzH,EAAMyH,KACjB,MAAO,CACLnG,KAAM,iBACNojB,aAActc,KAAKuc,wBACnBlM,QAAShR,EAAKgR,QACdC,SAAUjR,EAAKiR,SACf7K,UAAWpG,EAAKoG,UAChBE,cAAetG,EAAKsG,cACpBC,SAAUvG,EAAKuG,SACf2K,cAAelR,EAAKkR,cACpBC,SAAUnR,EAAKmR,SACfE,KAAMrR,EAAKqR,KACXG,UAAWxR,EAAKwR,UAEpB,CAEA,kBAAAgL,CAAmBjkB,GACjB,IAAIyH,EAAOzH,EAAMyH,KAEjB,MAAO,CACLnG,KAAM,aACNwX,KAAM1Q,KAAKwc,oBACXC,OAAQpd,EAAKqd,OACbJ,aAActc,KAAKuc,wBAEvB,CAEA,yBAAAT,CAA0BlkB,GACxB,IAAKA,EAAMyH,KAAK8T,kBAAmB,MAAM,IAAIuD,MAAM,8BAGnD,MAAO,CACLxd,KAAM,gBACNyjB,UAJYhc,EAAgBuC,QAAQtL,EAAMyH,KAAK8T,mBAI5ByJ,SACnBlM,KAAM1Q,KAAKwc,oBACXhM,SAAUra,SAASsa,SACnB6L,aAActc,KAAKuc,wBAEvB,CAEA,yBAAAR,CAA0BnkB,GACxB,IAAIyH,EAAOzH,EAAMyH,KAEjB,MAAO,CACLqR,KAAM1Q,KAAKwc,oBACXK,WAAYxd,EAAKyd,aACjBR,aAActc,KAAKuc,wBACnBrjB,KAAM,eAEV,CAEA,qBAAA+iB,CAAsBrkB,GACpB,IAAKA,EAAMyH,KAAK8T,kBAAmB,MAAM,IAAIuD,MAAM,8BAEnD,IAAI3V,EAAUJ,EAAgBuC,QAAQtL,EAAMyH,KAAK8T,mBAE7C+D,GADiBvW,EAAgBuD,sBAAsBtM,EAAMyH,KAAK8T,kBAAoB,IAAMvb,EAAMyH,KAAK0V,eACpFpU,EAAgBiD,mBAAmBhM,EAAMyH,KAAKwE,SAAU9C,EAAQqT,IAAM,GACzFpS,EAAWrB,EAAgBoB,WAE/B,MAAO,CACL7I,KAAM,uBACNwX,KAAM1Q,KAAKwc,oBACXF,aAActc,KAAKuc,wBACnBI,UAAW5b,EAAQ6b,SACnBG,SAAUnlB,EAAMyH,KAAK+Y,SACrB4E,WAAYplB,EAAMyH,KAAK4d,MACvBC,aAAchG,EACdiG,SAAUvlB,EAAMyH,KAAKwE,SACrBuZ,OAAQpb,EAASqb,SACjBC,KAAMtb,EAASub,SAEnB,CAEA,0BAAApB,CAA2BvkB,GACzB,IAAImJ,EAAUJ,EAAgBuC,QAAQtL,EAAMyH,KAAK8T,mBAC5BxS,EAAgBuD,sBAAsBtM,EAAMyH,KAAK8T,kBAAoB,IAAMvb,EAAMyH,KAAK0V,eAE3G,MAAO,CACL7b,KAAM,2BACNwX,KAAM1Q,KAAKwc,oBACXF,aAActc,KAAKuc,wBACnBiB,IAAKzc,EAAQqT,GACb4I,WAAYplB,EAAMyH,KAAK4d,MAE3B,CAEA,yBAAAb,CAA0BxkB,GACxB,IAAIyH,EAAOzH,EAAMyH,KACb0B,EAAUJ,EAAgBuC,QAAQtL,EAAMyH,KAAK8T,mBAC5BxS,EAAgBuD,sBAAsBtM,EAAMyH,KAAK8T,kBAAoB,IAAMvb,EAAMyH,KAAK0V,eAE3G,MAAO,CACL7b,KAAM,yBACNojB,aAActc,KAAKuc,wBACnBkB,YAAape,EAAKqe,YAClBC,YAAate,EAAKue,YAClBJ,IAAKzc,EAAQqT,GACb4I,WAAYplB,EAAMyH,KAAK4d,MACvBY,IAAK7d,KAAKwc,oBAEd,CAEA,4BAAAH,CAA6BzkB,GAC3B,IAAKA,EAAMyH,KAAKsU,mBAAoB,MAAM,IAAI+C,MAAM,+BACpD,IAAK9e,EAAMyH,KAAKuU,eAAgB,MAAM,IAAI8C,MAAM,oCAChD,GAAI9e,EAAMyH,KAAKuU,eAAetb,QAAUV,EAAMyH,KAAKsU,mBAAmBrb,OAAQ,MAAM,IAAIoe,MAAM,4DAK9F,IAJA,IAAIC,EAAqB,GAErBmH,GADWnd,EAAgBkB,WACC,IAEvBxJ,EAAI,EAAGA,EAAIT,EAAMyH,KAAKsU,mBAAmBrb,OAAQD,IACxDse,EAAS7d,KAAKlB,EAAMyH,KAAKsU,mBAAmBtb,GAAK,IAAMT,EAAMyH,KAAKuU,eAAevb,IAGnF,IAAI0e,EAAgBpW,EAAgB0C,SAASzL,EAAMyH,KAAKsU,oBACpDqD,EAAcrW,EAAgBwD,uBAAuBwS,GAEzD,IAASte,EAAI,EAAGA,EAAI0e,EAAcze,OAAQD,IAAK,CAC7C,IAAI0I,EAAUgW,EAAc1e,GAGxBiH,GAFiB0X,EAAY3e,GAErB0e,EAAc9S,QAAQlD,IAC9BmW,EAAmBvW,EAAgBiD,mBAAmBhM,EAAMyH,KAAKwT,QAAQvT,GAAQyB,EAAQqT,IAAM,EAEnG0J,EAAmBhlB,KAAK,CACtBI,KAAM,oBACNojB,aAActc,KAAKuc,wBACnBW,aAAchG,EACdiG,SAAUvlB,EAAMyH,KAAKwT,QAAQvT,GAC7BoR,KAAM1Q,KAAKwc,oBACXG,UAAW5b,EAAQ6b,UAEvB,CAEA,OAAOkB,CACT,CAEA,iBAAAtB,GACE,OAAO/lB,OAAOka,SAASC,QACzB,CAEA,qBAAA2L,GAEE,OADW,IAAKzR,MAAM4Q,aAExB,ECzMK,MAAMqC,GACX,YAAAzW,CAAa1P,GACX,IAAIie,EAEJ,OAAQje,EAAMF,UAAUP,eAEtB,KAAKgR,EAAWmE,gBACduJ,EAAc7V,KAAKgW,cAAcpe,GACjC,MAEF,KAAKuQ,EAAWiE,SACdyJ,EAAc7V,KAAKge,cAAcpmB,GACjC,MAEF,KAAKuQ,EAAWsE,UACdoJ,EAAc7V,KAAKmW,eAAeve,GAClC,MAEF,KAAKuQ,EAAWyE,gBACdiJ,EAAc7V,KAAKqW,qBAAqBze,GACxC,MAEF,KAAKuQ,EAAW0E,kBACdgJ,EAAc7V,KAAKuW,uBAAuB3e,GAC1C,MAEF,KAAKuQ,EAAW8E,SACd4I,EAAc7V,KAAKie,cAAcrmB,GACjC,MAEF,KAAKuQ,EAAW+E,UACd2I,EAAc7V,KAAKke,eAAetmB,GAKtC,OAAOie,CACT,CAGA,aAAAG,CAAcpe,GACZ,IAAKA,EAAMyH,KAAK8T,kBAAmB,MAAM,IAAIuD,MAAM,8BAEnD,IAAI3V,EAAUJ,EAAgBuC,QAAwBtL,EAAMyH,KAAK8T,mBAC7DyD,EAAWjW,EAAgBkB,WAkB/B,MAhBmB,CACjBjK,MAAO,iBACPyH,KAAM,CACJ8e,YAAapd,EAAQ4W,YACrByG,UAAWrd,EAAQqT,GACnByD,MAAO9W,EAAQ8W,MACfa,YAAa3X,EAAQ2X,YACrBJ,QAASvX,EAAQuX,QACjBE,OAAQzX,EAAQyX,OAChB6F,MAAOtd,EAAQsd,MACfC,WAAYvd,EAAQud,WACpBhO,SAAUsG,EAAS5R,aACnBqV,aAActZ,EAAQsZ,cAK5B,CAGA,aAAA2D,CAAcpmB,GACZ,IAAIyH,EAAOzH,EAAMyH,KAWjB,MAVmB,CACjBzH,MAAO,cACPyH,KAAM,CACJqR,KAAMja,OAAOka,SAASC,SACtB2N,SAAU9nB,OAAOka,SAAS8D,KAC1BgI,OAAQpd,EAAKqd,OACbJ,cAAc,IAAKxR,MAAM4Q,eAK/B,CAEA,cAAAvF,CAAeve,GACb,MAAMwJ,EAAST,EAAgBkE,SAC/B,IAAKzD,GAAgC,GAAtBA,EAAOka,KAAKhjB,OACzB,OAEF,IAAIse,EAAWjW,EAAgBkB,WAC/B,MAAMkX,EAAe,GACfyF,EAAsB,GAC5Bpd,EAAOka,KAAKniB,SAASslB,IACnB,IAAI1d,EAAUJ,EAAgBuC,QAAwBub,EAActL,mBACpE4F,EAAMjgB,KAAK,CACTslB,UAAWrd,EAAQqT,GACnBsK,IAAK3d,EAAQqT,GACb+J,YAAapd,EAAQ4W,YACrBoF,SAAU0B,EAAcvE,IACxByE,UAAW5d,EAAQsd,MACnBO,SAAU7d,EAAQsd,MAAQI,EAAcvE,IACxC2E,WAAY9d,EAAQ+d,mBACpBC,SAAUhe,EAAQie,gBAClBC,kBACEle,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW7Y,WAAa,CAAC6B,EAAQ2X,aAC3Eb,MAAO9W,EAAQ8W,QAEjB2G,EAAU1lB,KAAKiI,EAAQ4W,YAAY,IAErC,IAAIuH,EAAWnG,EAAMA,EAAMzgB,OAAS,GAkBpC,MAjBqB,CACnBV,MAAO,gBACPyH,KAAM,CACJ8f,OAAQ/d,EAAOge,YACfC,qBAAsBH,EAASf,YAC/BmB,mBAAoBJ,EAASd,UAC7BmB,aAAcL,EAASR,IACvBc,oBAAqBN,EAASD,kBAC9BQ,kBAAmBP,EAASH,SAC5BW,aAAcR,EAASL,WACvBc,eAAgBT,EAASP,UACzBiB,kBAAmBV,EAASnC,SAC5B8C,UAAWrB,EAAUtf,WACrB4gB,YAAalJ,EAASmJ,aACtBC,MAAOjH,GAIb,CAEA,oBAAA1C,CAAqBze,GACnB,IAAKA,EAAMyH,KAAK2a,kBAA0D,GAAtCpiB,EAAMyH,KAAK2a,iBAAiB1hB,OAAa,MAAM,IAAIoe,MAAM,qBAE7F,IAAIqC,EAAe,GACfyF,EAAsB,GAC1B,IAAIyB,EAA0B,IAAIC,IAClC,IAAIC,EAAqB,EAGzBvoB,EAAMyH,KAAK2a,iBAAiB7gB,SAAS8gB,IACnC,IAAIlZ,EAAUJ,EAAgBuC,QAAwB+W,EAAgB9G,mBAClE8D,EAAiBtW,EAAgBuD,sBAAsB+V,EAAgB9G,kBAAoB,IAAM8G,EAAgBlF,eAErHkL,EAAWpjB,IAAIkE,EAAQ2X,aAEvB8F,EAAU1lB,KAAKiI,EAAQ4W,aAEvBoB,EAAMjgB,KAAK,CACTslB,UAAWrd,EAAQqT,GACnBsK,IAAK3d,EAAQqT,GACb+J,YAAapd,EAAQ4W,YACrBoF,SAAU9C,EAAgBC,IAC1B2E,WAAY9d,EAAQ+d,mBACpBC,SAAUhe,EAAQie,gBAClBC,kBAAmBle,EAAQgX,WAAWzf,OAAS,EAAIyI,EAAQgX,WAAW7Y,WAAa,CAAC6B,EAAQ2X,eAG9FyH,GAAiBlJ,EAAemI,YAAcnF,EAAgBC,GAAG,IAInE,IAAItD,EAAWjW,EAAgBkB,WAY/B,MAXmB,CACjBjK,MAAO,mBACPyH,KAAM,CACJ0Y,WAAYvb,MAAM4jB,KAAKH,EAAWI,UAClCP,YAAalJ,EAASmJ,aACtBF,UAAWrB,EACXwB,MAAOjH,EACPoG,OAAQgB,GAKd,CAEA,sBAAA5J,CAAuB3e,GACrB,GAAIA,EAAMyH,KAAKihB,wBAOb,MANmB,CACjB1oB,MAAO,KACPyH,KAAM,KACNsM,SAAU/T,EAAMyH,KAAKihB,wBAK3B,CAEA,aAAArC,CAAcrmB,GASZ,MARmB,CACjBA,MAAO,YACPyH,KAAM,CACHkhB,MAAO3oB,EAAMyH,KAAKkhB,OAErB5U,SAAU/T,EAAMyH,KAAKkhB,MAIzB,CAEA,cAAArC,CAAetmB,GAQb,MAPmB,CACjBA,MAAO,aACPyH,KAAM,CACJkhB,MAAO3oB,EAAMyH,KAAKkhB,OAKxB,E,ICjNQ,G,mTAAV,SAAUxU,IAAO,SAAAyU,IAAO,SAAAC,GA6UtB,SAAehX,EAAgBiX,G,0CACxBA,IACLjqB,OAAkB,UAAIA,OAAkB,WAAK,GAC7CA,OAAkB,UAAEqC,KAAK4nB,GAM3B,G,CA/Pa,EAAAC,2BAA6B,CAAO5J,EAAwClT,EAAkBmB,IAAuC,mCAShJyE,EAJ0B,CACxB7R,MAAO,cACP+R,UANgD,CAChDiX,YAAa7J,EACb/R,aAAcA,IAOlB,IAEa,EAAA6b,sBAAwB,CAAO9J,EAAmClT,EAAkBmB,IAAuC,mCActIyE,EAJ0B,CACxB7R,MAAO,eACP+R,UAXsC,CACtCmX,MAAO,CACLC,YAAa,CACXC,KAAMC,EAAgBpd,IAExB/C,SAAUiW,EACV/R,aAAcA,KAQpB,IAEa,EAAAkc,uBAAyB,CAAOnK,EAAoClT,EAAkBmB,IAA+B,mCAchIyE,EAJ0B,CACxB7R,MAAO,gBACP+R,UAXwC,CACxC7R,OAAQ,CACNipB,YAAa,CACXC,KAAMC,EAAgBpd,IAExB/C,SAAUiW,EACV/R,aAAcA,KAQpB,IAEa,EAAAmc,oBAAsB,CAAOpK,EAAoClT,EAAkBmB,IAAuC,mCAcrIyE,EAJ0B,CACxB7R,MAAO,YACP+R,UAXqC,CACrC9M,IAAK,CACHkkB,YAAa,CACXC,KAAMC,EAAgBpd,IAExB/C,SAAUiW,EACV/R,aAAcA,KAQpB,IAEa,EAAAoc,uBAAyB,CAAOrK,EAAoClT,IAAmC,mCAalH4F,EAJ0B,CACxB7R,MAAO,iBACP+R,UAVwC,CACxC/M,OAAQ,CACNmkB,YAAa,CACXC,KAAMC,EAAgBpd,IAExB/C,SAAUiW,KAQhB,IAEa,EAAAsK,kBAAoB,CAAOtK,EAAoCuK,EAAcC,IAAiC,mCAczH9X,EAJ0B,CACxB7R,MAAO,WACP+R,UAXqC,CACrC6X,SAAU,CACRT,YAAa,CACXO,KAAMA,EACNC,OAAQA,GAEVzgB,SAAUiW,KAQhB,IAEa,EAAA0K,iBAA0BnS,GAAgC,mC,MAIrE,OAHkB,QAAd,EAAAA,aAAQ,EAARA,EAAUjQ,YAAI,eAAEqiB,YAClB,EAAAC,mBAAmBrS,EAASjQ,KAAKqiB,WAE5BpS,CACT,IAEa,EAAAqS,mBAA4BC,GAAkC,mCACpEA,GAELA,EAAWzoB,SAAQ0oB,IAEjB,GAAKA,aAAS,EAATA,EAAWnqB,UAEhB,OAAQmqB,EAAUnqB,WAChB,IAAK,YAAa,CAChB,IAAIoJ,EAAgC,GACpC+gB,EAAU/gB,SAAS3H,SAAQ2oB,IACzB,IAAI/gB,EAA6B,CAC/BghB,MAAOD,EAAYC,MACnBC,SAAUF,EAAYE,SACtBljB,GAAIgjB,EAAYhjB,GAChBM,KAAM0iB,EAAY1iB,KAClB+B,MAAO2gB,EAAY3gB,MACnBiW,QAAS0K,EAAY1K,QACrBgB,SAAU0J,EAAY1J,SACtB6J,WAAYH,EAAYG,WACxBC,WAAYJ,EAAYI,WACxBC,WAAYL,EAAYK,WACxBC,WAAYN,EAAYM,YAE1BthB,EAAShI,KAAKiI,EAAQ,IAExB,EAAAogB,oBAAoBrgB,EAAU+gB,EAAUhe,SAAUge,EAAU7c,cAC5D,KACF,CACA,IAAK,iBAAkB,CACrB,IAAIlE,EAAgC,GACpC+gB,EAAU/gB,SAAS3H,SAAQ2oB,IACzB,IAAI/gB,EAA6B,CAC/BghB,MAAOD,EAAYC,MACnBC,SAAUF,EAAYE,SACtBljB,GAAIgjB,EAAYhjB,GAChBM,KAAM0iB,EAAY1iB,KAClB+B,MAAO2gB,EAAY3gB,MACnBiW,QAAS0K,EAAY1K,QACrBgB,SAAU0J,EAAY1J,SACtB6J,WAAYH,EAAYG,WACxBC,WAAYJ,EAAYI,WACxBC,WAAYL,EAAYK,WACxBC,WAAYN,EAAYM,YAE1BthB,EAAShI,KAAKiI,EAAQ,IAExB,EAAAqgB,uBAAuBtgB,EAAU+gB,EAAUhe,UAC3C,KACF,CACA,IAAK,eAAgB,CACnB,IAAIwe,EAAoC,GACxCR,EAAU/gB,SAAS3H,SAAQ2oB,IACzB,IAAIQ,EAAiC,CACnCP,MAAOD,EAAYC,MACnBC,SAAUF,EAAYE,SACtBljB,GAAIgjB,EAAYhjB,GAChBM,KAAM0iB,EAAY1iB,KAClB+B,MAAO2gB,EAAY3gB,MACnBiW,QAAS0K,EAAY1K,QACrBmL,SAAUT,EAAYS,SACtBN,WAAYH,EAAYG,WACxBC,WAAYJ,EAAYI,WACxBC,WAAYL,EAAYK,WACxBK,WAAY,GACZJ,WAAYN,EAAYM,YAE1BC,EAAcvpB,KAAKwpB,EAAa,IAElC,EAAAzB,sBAAsBwB,EAAeR,EAAUhe,SAAUge,EAAU7c,cACnE,KACF,CACA,IAAK,cAAe,CAClB,IAAIyd,EAA8C,GAClDZ,EAAU/gB,SAAS3H,SAAQ2oB,IACzB,IAAIY,EAA2C,CAC7CX,MAAOD,EAAYC,MACnBC,SAAUF,EAAYE,SACtBljB,GAAIgjB,EAAYhjB,GAChBM,KAAM0iB,EAAY1iB,KAClB+B,MAAO2gB,EAAY3gB,MACnBiW,QAAS0K,EAAY1K,QACrBmL,SAAUT,EAAYS,SACtBvB,KAAMC,EAAgBa,EAAYd,MAClCiB,WAAYH,EAAYG,WACxBC,WAAYJ,EAAYI,WACxBC,WAAYL,EAAYK,WACxBC,WAAYN,EAAYM,YAE1BK,EAAmB3pB,KAAK4pB,EAAkB,IAE5C,EAAA/B,2BAA2B8B,EAAoBZ,EAAUhe,SAAUge,EAAU7c,cAC7E,KACF,CACA,IAAK,WAAY,CACf,IAAIlE,EAAgC,GACpC+gB,EAAU/gB,SAAS3H,SAAQ2oB,IACzB,IAAI/gB,EAA6B,CAC/BghB,MAAOD,EAAYC,MACnBC,SAAUF,EAAYE,SACtBljB,GAAIgjB,EAAYhjB,GAChBM,KAAM0iB,EAAY1iB,KAClB+B,MAAO2gB,EAAY3gB,MACnBiW,QAAS0K,EAAY1K,QACrBgB,SAAU0J,EAAY1J,SACtB6J,WAAYH,EAAYG,WACxBC,WAAYJ,EAAYI,WACxBC,WAAYL,EAAYK,WACxBC,WAAYN,EAAYM,YAE1BthB,EAAShI,KAAKiI,EAAQ,IAExB,EAAAsgB,kBAAkBvgB,EAAU+gB,EAAUP,KAAMO,EAAUN,QACtD,KACF,CACA,IAAK,gBAAiB,CACpB,IAAIoB,EAAsC,GAC1Cd,EAAU/gB,SAAS3H,SAAQ2oB,IACzB,IAAIc,EAAmC,CACrCb,MAAOD,EAAYC,MACnBC,SAAUF,EAAYE,SACtBljB,GAAIgjB,EAAYhjB,GAChBM,KAAM0iB,EAAY1iB,KAClB+B,MAAO2gB,EAAY3gB,MACnBiW,QAAS0K,EAAY1K,QACrB6K,WAAYH,EAAYG,WACxBC,WAAYJ,EAAYI,WACxBC,WAAYL,EAAYK,WACxBC,WAAYN,EAAYM,YAE1BO,EAAe7pB,KAAK8pB,EAAc,IAEpC,EAAA1B,uBAAuByB,EAAgBd,EAAUhe,SAAUge,EAAU7c,cACrE,KACF,CACA,QAEE6d,QAAQC,IAAIjB,GAEhB,GAEJ,IAaA,MAAMZ,EAAmB8B,IACvB,IAAKA,EAAU,OAAO,KAGtB,OAFsBA,EAAS9f,QAAQ,OAAQ,IAAIA,QAAQ,IAAK,IAAI9L,aAE9C,CAEzB,CA9VuB,GAAAspB,UAAA,EAAAA,QAAO,IA8V9B,CA9VgB,GAAAD,SAAA,EAAAA,OAAM,IA8VtB,CA9VD,CAAU,QAAM,KAgWhB,SAAe,GAAOA,OAAc,Q,IC7V1B,G,wSAAV,SAAUzU,IAAO,SAAAyU,IAAO,SAAAC,GA2DtB,SAASuC,EAA2BC,G,MAC9BC,EAAqC,QAAxB,EAAA/sB,SAASgtB,uBAAe,eAAEjQ,aAAa,oBAGxD,OAFI+P,IAAQA,EAAI/rB,WAAW,OACzB+rB,EAAM,IAAMA,GACVC,IACFA,EAAaA,EAAWE,SAAS,KAAOF,EAAWG,MAAM,GAAI,GAAKH,GACnD5qB,OAAS,IAAM4qB,EAAWhsB,WAAW,OAClDgsB,EAAa,IAAMA,GACjBD,EACKC,EAAaD,EAEbC,GAGFD,CACX,CApEa,EAAAtjB,IAAM,CAAOsjB,EAAaK,IAA8C,mCACnFC,GAAA,EAAMC,SAASC,QAAQC,OAAuB,gBAAI,EAClDH,GAAA,EAAMC,SAASC,QAAQC,OAAoB,YAAIjtB,OAAOka,SAAS8D,KAE/DwO,EAAMD,EAA2BC,GAEjC,IAAI3T,QAAiBiU,GAAA,EAAM5jB,IAAIsjB,EAAKK,GAEpC,OADA,EAAM9V,mBAAmBgI,qBAAqBlG,SACjC,GAAgBmS,iBAAiBnS,EAChD,IAEa,EAAAqU,KAAO,CAAOV,EAAa5jB,EAAWukB,EAAgBN,IAAgC,mCAC7FM,IACFL,GAAA,EAAMC,SAASC,QAAQC,OAAiC,yBAAIE,GAE9DL,GAAA,EAAMC,SAASC,QAAQC,OAAuB,gBAAI,EAClDH,GAAA,EAAMC,SAASC,QAAQC,OAAoB,YAAIjtB,OAAOka,SAAS8D,KAE/DwO,EAAMD,EAA2BC,GAEjC,IAAI3T,QAAiBiU,GAAA,EAAMI,KAAKV,EAAK5jB,EAAMikB,GAE3C,OADA,EAAM9V,mBAAmBgI,qBAAqBlG,SACjC,GAAgBmS,iBAAiBnS,EAChD,IAEa,EAAAuU,MAAQ,CAAOZ,EAAa5jB,EAAWukB,EAAgBN,IAAgC,mCAC9FM,IACFL,GAAA,EAAMC,SAASC,QAAQC,OAAiC,yBAAIE,GAE9DL,GAAA,EAAMC,SAASC,QAAQC,OAAuB,gBAAI,EAClDH,GAAA,EAAMC,SAASC,QAAQC,OAAoB,YAAIjtB,OAAOka,SAAS8D,KAE/DwO,EAAMD,EAA2BC,GAEjC,IAAI3T,QAAiBiU,GAAA,EAAMM,MAAMZ,EAAK5jB,EAAMikB,GAE5C,OADA,EAAM9V,mBAAmBgI,qBAAqBlG,SACjC,GAAgBmS,iBAAiBnS,EAChD,IAEa,EAAAwU,YAAc,CAAOb,EAAaW,EAAgBN,IAAgC,mCACzFM,IACFL,GAAA,EAAMC,SAASC,QAAQC,OAAiC,yBAAIE,GAE9DL,GAAA,EAAMC,SAASC,QAAQC,OAAuB,gBAAI,EAClDH,GAAA,EAAMC,SAASC,QAAQC,OAAoB,YAAIjtB,OAAOka,SAAS8D,KAE/DwO,EAAMD,EAA2BC,GAEjC,IAAI3T,QAAiBiU,GAAA,EAAMQ,OAAOd,EAAKK,GAEvC,OADA,EAAM9V,mBAAmBgI,qBAAqBlG,SACjC,GAAgBmS,iBAAiBnS,EAChD,GAkBD,CA3EuB,GAAAmR,UAAA,EAAAA,QAAO,IA2E9B,CA3EgB,GAAAD,SAAA,EAAAA,OAAM,IA2EtB,CA3ED,CAAU,QAAM,KA6EhB,SAAe,GAAOA,OAAc,Q,IC/E1B,G,wSAAV,SAAUzU,IAAO,SAAAiY,IAAI,SAAAC,IAAS,YAef,EAAAC,OAAS,CAAO7kB,EAAmBukB,IAAgC,mCAC9E,aAAa,GAAYD,KAAK,UAAWtkB,EAAMukB,EACjD,IAEa,EAAAO,eAAiB,CAAO9kB,EAAsBukB,IAAgC,mCACzF,aAAa,GAAYD,KAAK,0BAA2BtkB,EAAMukB,EACjE,GACD,CAtB6B,GAAAM,SAAA,EAAAA,OAAM,IAsBnC,CAtBoB,GAAAD,WAAA,EAAAA,SAAQ,IAsB5B,CAtBgB,GAAAD,MAAA,EAAAA,IAAG,IAsBnB,CAtBD,CAAU,QAAM,KAwBhB,SAAe,GAAOA,IAAIC,SAAe,O,ICP/B,G,8mBAfH,MAAMG,GAEX,WAAA3W,CACI4W,EAA0B,EAC1BC,EAAuB,SAGzBtkB,KAAKukB,gBAAkBF,EACvBrkB,KAAKwkB,aAAeF,CACtB,GAMF,SAAUvY,IAAO,SAAAwB,G,MAGf,IAAa2W,EAAM,EAAnB,MA4BE,WAAAzW,CAAY6V,GAnBJ,KAAAmB,gBAA+B,KAC/B,KAAAC,eAA8B,KAG9B,KAAAC,oBAA8B,KAC9B,KAAAC,mBAA6B,KAenC,EAAOC,SAAW7kB,KAEJ,MAAVsjB,IACF,EAAOuB,SAASR,gBAAkBf,EAAOiB,gBACzC,EAAOM,SAASP,aAAehB,EAAOkB,aAE1C,CAEA,MAAAM,GAEE7rB,EAAY,CACVC,KAAM,UACNtB,MAAO,CACL2B,OAAQ,eACRlC,SAAU,EAAO0tB,YAIrB9rB,EAAY,CACVC,KAAM,QACNtB,MAAO,CACL2B,OAAQ,eACRlC,SAAU,EAAS,EAAO0tB,SAAU,QAIxC9rB,EAAY,CACVC,KAAM,QACNtB,MAAO,CACLA,MAAO,eACPP,SAAU,EAAO2tB,eAIrB/rB,EAAY,CACVC,KAAM,QACNtB,MAAO,CACL2B,OAAQ,oBACRlC,SAAU,EAAO4tB,sBAInBhsB,EAAY,CACVC,KAAM,QACNtB,MAAO,CACL2B,OAAQ,cACRlC,SAAU,EAAO6tB,eAIzB,CAiGQ,mCAAOC,G,MACb,OAAwC,MAAjC,EAAON,SAASO,gBAAsD,QAA7B,IAAOP,SAASO,qBAAa,eAAE9sB,SAAU,EAAOusB,SAASR,eAC3G,CAEQ,uCAAOgB,G,MACb,OAAwC,MAAjC,EAAOR,SAASO,gBAAsD,QAA7B,IAAOP,SAASO,qBAAa,eAAE9sB,QAAS,EAAOusB,SAASR,eAC1G,CAEQ,2BAAOiB,G,MACb,OAAQ,EAAOT,SAASU,6BAA+B,EAAOV,SAASW,yBAC/B,MAAjC,EAAOX,SAASO,gBAAsD,QAA7B,IAAOP,SAASO,qBAAa,eAAE9sB,QAAS,EAAOusB,SAASR,eAC1G,CA6HQ,kBAAOW,CAAY9qB,GAMzB,OALAA,EAAE4a,iBACF5a,EAAE2a,kBAEF,EAAOgQ,SAASY,eAET,CACT,CAkBA,WAAAA,GACE,EAAOZ,SAASa,iBAAiB,MACjC,EAAOb,SAASc,aAAa,MAC7B,EAAOd,SAASe,YAAYC,OAC5B,EAAOhB,SAASe,YAAY5qB,MAAQ,GAEA,UAAhC7E,SAAS4D,KAAKgC,MAAM+pB,WAAsB3vB,SAAS4D,KAAKgC,MAAM+pB,SAAW,QAC7ExpB,EAAUnG,SAAS4D,KAAM,QAES,MAA9B,EAAO8qB,SAASkB,YAClB1pB,EAAK,EAAOwoB,SAASkB,WAEzB,CAEA,gBAAAC,CAAiB9rB,GACA,YAAXA,EAAEhB,OACC,EAAO2rB,SAASoB,0BAA0B/rB,IAAuC,MAAjC,EAAO2qB,SAASqB,eACnE7pB,EAAK,EAAOwoB,SAASqB,eAG3B,CAEA,gBAAAR,CAAiBxrB,IACfA,aAAC,EAADA,EAAGC,SAAW,EAAO0qB,SAASoB,0BAA0B/rB,IAAKmC,EAAK,EAAOwoB,SAASqB,eAAuB7pB,EAAK,EAAOwoB,SAASqB,eAC9H,EAAOrB,SAASsB,iBAAiBxpB,UAAUC,OAAO,SACpD,CAEA,gBAAAwpB,CAAiBlsB,IACfA,aAAC,EAADA,EAAGC,SAAW,EAAO0qB,SAASoB,0BAA0B/rB,IAAKgC,EAAK,EAAO2oB,SAASqB,cAAe,EAAOrB,SAASP,cAAsBpoB,EAAK,EAAO2oB,SAASqB,cAAe,EAAOrB,SAASP,aAC7L,CAEA,YAAAqB,CAAazrB,G,SACXA,aAAC,EAADA,EAAGC,SAAW,EAAO0qB,SAASoB,0BAA0B/rB,KAA6B,QAAxB,IAAO2qB,SAASwB,gBAAQ,SAAE1pB,UAAUE,IAAI,WAA0C,QAAxB,IAAOgoB,SAASwB,gBAAQ,SAAE1pB,UAAUC,OAAO,SACpK,CAEA,YAAA0pB,CAAapsB,G,QACP,EAAO2qB,SAASwB,YAClBnsB,aAAC,EAADA,EAAGC,SAAW,EAAO0qB,SAASoB,0BAA0B/rB,KAA6B,QAAxB,IAAO2qB,SAASwB,gBAAQ,SAAE1pB,UAAUC,OAAO,WAA0C,QAAxB,IAAOioB,SAASwB,gBAAQ,SAAE1pB,UAAUE,IAAI,UACtK,CAEA,yBAAAopB,CAA0B/rB,GACxB,OAA6B,MAAzB8F,KAAKmmB,kBAIFnmB,KAAKmmB,iBAAiBI,SAASrsB,EAAEC,OAC1C,GA/Se,EAAA+qB,aAAsBhrB,GAAM,qCACzCA,EAAE4a,iBACF5a,EAAE2a,kBAGF,MAAMhZ,EAAK3B,EAAEC,OACPqsB,EAAS3qB,aAAE,EAAFA,EAAI2X,cACbiT,EAAqBD,aAAM,EAANA,EAAQpwB,cAAc,gCAEjD,QAAKqwB,UACC,EAAOC,sBAAsBD,GACnC,EAAO5B,SAAS8B,aAAc,EAC9BF,EAAmBG,SAEZ,EACT,IAEe,EAAA7B,SAAkB7qB,GAAM,qC,QAUrC,GATAA,EAAE4a,iBACF5a,EAAE2a,kBAGa,YAAX3a,EAAEhB,aACE,EAAOwtB,sBAAsBxsB,EAAEC,QACrC,EAAO0qB,SAAS8B,aAAc,GAGlB,WAAVzsB,EAAE6F,IACJ,EAAOilB,YAAY9qB,QACd,GAAe,YAAXA,EAAEhB,MAAiC,UAAXgB,EAAEhB,KAAkB,CAErD,EAAO2rB,SAASyB,aAAa,MAEzB,EAAOzB,SAASkB,YAAY7pB,EAAK,EAAO2oB,SAASkB,YAErD,MAAM/qB,EAAwD,QAAxC,IAAO6pB,SAASe,YAAY5qB,MAAM/D,cAAM,QAAI,GAGlE,GAAI,EAAO4tB,SAASO,iBAAkBpqB,aAAK,EAALA,EAAO/D,QAAQ,CACnD,EAAO4tB,SAASO,cAAgBpqB,aAAK,EAALA,EAAO/D,OAEvC,MAAM4vB,EAAc3sB,EAAEC,OAAOY,WACvB6oB,EAAiC,QAAzB,EAAAiD,EAAY,qBAAa,eAAE7rB,MAErC,EAAOmqB,sCAEH,EAAO2B,8BAA8BD,EAAajD,GAEnD,EAAOiB,SAASkC,4BAAgE,MAAlC,EAAOlC,SAASH,iBACjE,EAAOG,SAASH,eAAe3oB,MAAMC,QAAU,QAG5C,EAAO6oB,SAASmC,8BAAkE,MAAlC,EAAOnC,SAASH,iBACnE,EAAOG,SAASH,eAAe3oB,MAAMC,QAAU,SAGxC,EAAOspB,wBAEX,EAAOT,SAASkC,4BAAgE,MAAlC,EAAOlC,SAASH,iBACjE,EAAOG,SAASH,eAAe3oB,MAAMC,QAAU,QAG5C,EAAO6oB,SAASmC,8BAAkE,MAAlC,EAAOnC,SAASH,iBACnE,EAAOG,SAASH,eAAe3oB,MAAMC,QAAU,cAG3C,EAAOmoB,eAAeP,IAElB,EAAOiB,SAAS8B,aAE1B,EAAO9B,SAASY,cAId,EAAOJ,qCACT,EAAOR,SAASqB,cAAcnqB,MAAMC,QAAU,OAElD,CACF,CAEA,OAAO,CACT,IAEe,EAAAipB,mBAA4B/qB,GAAM,qC,MAC/CA,EAAE4a,iBACF5a,EAAE2a,kBAEF,MACMoS,EAA2C,QAAhC,EADY/sB,EAAEC,OACNY,WAAW,qBAAa,eAAEC,MAKnD,OAHA,EAAO6pB,SAASe,YAAY5qB,MAAQisB,EACpC,EAAOpC,SAASe,YAAYgB,SAErB,CACT,IAee,EAAAE,8BAAgC,CAAOD,EAAkBjD,IAAe,qC,cACrF,MAAMrtB,EAAUJ,SAASC,cAAc,4DACjC8wB,EAAW3wB,EAAUA,EAAQ2c,aAAa,8BAAgC,GAC1EiU,EAAa,CACjBC,gBAAiBlsB,EAAmD,QAApC,EAAA2rB,EAAY,gCAAwB,eAAE7rB,OACtEqsB,cAAensB,EAAiD,QAAlC,EAAA2rB,EAAY,8BAAsB,eAAE7rB,OAClEssB,aAAcpsB,EAAgD,QAAjC,EAAA2rB,EAAY,6BAAqB,eAAE7rB,OAChEusB,qBAAsBrsB,EAAwD,QAAzC,EAAA2rB,EAAY,qCAA6B,eAAE7rB,OAChFwsB,yBAA0BtsB,EAAsD,QAAvC,EAAA2rB,EAAY,mCAA2B,eAAE7rB,OAClFysB,WAAY,EAAO5C,SAASO,cAC5BsC,qBAAsBR,EACtBS,cAAe,EAAO9C,SAAS8C,eAGjC,GAAczD,OAAOiD,EAAYvD,GAAOxV,MAAMkB,KACxC,EAAOuV,SAASO,eAAiB9V,EAASjQ,KAAKnJ,QACjD,EAAO2uB,SAASO,cAAgB,MAG9B9V,EAASjQ,KAAKuoB,WAEZ,EAAO/C,SAASe,YAAY5qB,MAAM/D,SACpC,EAAO4tB,SAASqB,cAAcxqB,UAAY4T,EAASjQ,KAAKwoB,QACxD3rB,EAAK,EAAO2oB,SAASqB,cAAe,EAAOrB,SAASP,cAG1B,MADDnuB,SAASC,cAAc,kCACd,EAAOyuB,SAASiD,+BAAmE,MAAlC,EAAOjD,SAASH,eACjG,EAAOG,SAASH,eAAe3oB,MAAMC,QAAU,EAAO6oB,SAASP,aACpB,MAAlC,EAAOO,SAASH,iBACzB,EAAOG,SAASH,eAAe3oB,MAAMC,QAAU,SAGrD,GAEJ,IAEe,EAAAmoB,eAAwBP,GAAe,qCAGpD,GAA2C,MAAvC,EAAOiB,SAASF,qBAAqE,MAAtC,EAAOE,SAASD,mBAQjE,OANmC,MAAnC,EAAOC,SAASJ,kBAA0B,EAAOI,SAASJ,gBAAgB/oB,UAAY,EAAOmpB,SAASF,qBACnE,MAAnC,EAAOE,SAASJ,kBAA0B,EAAOI,SAASJ,gBAAgB1oB,MAAMC,QAAU,EAAO6oB,SAASP,cAExE,MAAlC,EAAOO,SAASH,iBAAyB,EAAOG,SAASH,eAAehpB,UAAY,EAAOmpB,SAASD,yBAClE,MAAlC,EAAOC,SAASH,iBAAyB,EAAOG,SAASH,eAAe3oB,MAAMC,QAAU,EAAO6oB,SAASP,eAK1G,MAAMyD,EAAgB,CACpBC,kBAAmB,EAAOnD,SAASU,4BACnC0C,mBAAoB,EAAOpD,SAASW,wBAGtC,GAAcrB,eAAe4D,EAAenE,GAAOxV,MAAMkB,IAEnD,EAAOuV,SAASO,eAAiB9V,EAASjQ,KAAKnJ,QACjD,EAAO2uB,SAASO,cAAgB,MAG9B9V,EAASjQ,KAAKuoB,UAEhB,EAAO/C,SAASJ,gBAAgB/oB,UAAY4T,EAASjQ,KAAK6oB,uBAC1D,EAAOrD,SAASF,oBAAsBrV,EAASjQ,KAAK6oB,uBAEpD,EAAOrD,SAASH,eAAehpB,UAAY4T,EAASjQ,KAAK8oB,sBACzD,EAAOtD,SAASD,mBAAqBtV,EAASjQ,KAAK8oB,sBAEF,KAA7C,EAAOtD,SAASH,eAAehpB,YACjC,EAAOmpB,SAASH,eAAe3oB,MAAMC,QAAU,EAAO6oB,SAASP,cAGf,KAA9C,EAAOO,SAASJ,gBAAgB/oB,UAClC,EAAOmpB,SAASJ,gBAAgB1oB,MAAMC,QAAU,EAAO6oB,SAASP,aAEhE,EAAOO,SAASJ,gBAAgB1oB,MAAMC,QAAU,OAEpD,GAEJ,IAEe,EAAA0qB,sBAA+BD,GAAyC,qC,oBACrF,MAAM2B,EAAY3B,EAAmBlS,QAAQ,iCAE7C,EAAOsQ,SAASsB,iBAAmBM,EAAmBlS,QAAQ,iCAC9D,EAAOsQ,SAASsB,iBAAiBxpB,UAAUE,IAAI,UAC/C,EAAOgoB,SAASe,YAAca,EAC9B,EAAO5B,SAASqB,cAAgB,EAAOrB,SAASsB,iBAAiB/vB,cAAc,oCAC/E,EAAOyuB,SAASJ,gBAAkB,EAAOI,SAASsB,iBAAiB/vB,cAAc,uCACjF,EAAOyuB,SAASH,eAAiB,EAAOG,SAASsB,iBAAiB/vB,cAAc,sCAChF,EAAOyuB,SAASwB,SAAgC,QAArB,EAAA+B,aAAS,EAATA,EAAWntB,kBAAU,eAAE7E,cAAc,sCACxC,QAAxB,IAAOyuB,SAASwB,gBAAQ,SAAE1pB,UAAUE,IAAI,UACxC,EAAOgoB,SAASkB,WAAa,EAAOlB,SAASsB,iBAAiB/vB,cAAc,+BAC5E,EAAOyuB,SAASwD,WAAa,EAAOxD,SAASsB,iBAAiB/vB,cAAc,QAC5E,EAAOyuB,SAAS8C,cAAgBzsB,EAAmE,QAApD,EAAAurB,EAAmB1rB,WAAW,8BAAsB,eAAEC,OACrG,EAAO6pB,SAASU,4BAA8BrqB,EAAyE,QAA1D,EAAAurB,EAAmB1rB,WAAW,oCAA4B,eAAEC,OACzH,EAAO6pB,SAASW,uBAAyBtqB,EAAmE,QAApD,EAAAurB,EAAmB1rB,WAAW,8BAAsB,eAAEC,OAC9G,EAAO6pB,SAASkC,2BAA6B7rB,EAAyE,QAA1D,EAAAurB,EAAmB1rB,WAAW,oCAA4B,eAAEC,OACxH,EAAO6pB,SAASyD,sBAAwBptB,EAAmE,QAApD,EAAAurB,EAAmB1rB,WAAW,8BAAsB,eAAEC,OAC7G,EAAO6pB,SAASiD,8BAAgC5sB,EAAuF,QAAxE,EAAAurB,EAAmB1rB,WAAW,kDAA0C,eAAEC,OAEzG,MAA5B,EAAO6pB,SAASwB,UfHI5vB,OAAO8xB,YAAc,MeI3CpyB,SAAS4D,KAAKgC,MAAM+pB,SAAW,SAC/B,EAAO3vB,SAAS4D,KAAM,SAGpB,EAAO8qB,SAAS8C,eAAe,EAAOA,gBAErC,EAAO9C,SAAS8C,eAAe,EAAOa,qBAC3C,EAAOC,yBACT,IAEe,EAAAA,wBAA0B,KACvC,MAAMpC,EAAW,EAAOxB,SAASwB,SACjCA,SAAAA,EAAU1tB,iBAAiB,SAAUf,I,QAC9ByuB,EAASE,SAAS3uB,EAAMuC,SAAYvC,EAAMuC,OAAOqR,aAAa,mBAAyE,oBAAX,QAAzC,EAAA5T,EAAMuC,OAAOY,WAAW,yBAAiB,eAAEC,UACjI,EAAO6pB,SAASY,cAChBtvB,SAAS4D,KAAKgC,MAAM+pB,SAAW,OACjC,GACC,CAAC4C,MAAM,GAAM,EAYH,EAAAF,mBAAqB,K,MACR,QAA1B,IAAO3D,SAASwD,kBAAU,SAAE1vB,iBAAiB,UAAWuB,IACjD,EAAO2qB,SAASe,YAAY5qB,OAC/Bd,EAAE4a,gBAEH,GACD,EAGW,EAAA6S,cAAgB,K,MACH,QAA1B,IAAO9C,SAASwD,kBAAU,SAAE1vB,iBAAiB,UAAWuB,IACpDA,EAAE4a,gBACI,GACR,EA9UOoP,EAAM,MADlBrmB,GACYqmB,GAAA,EAAAA,OAAM,CAiYpB,CApYgB,GAAA3W,UAAA,EAAAA,QAAO,IAoYvB,CApYD,CAAU,QAAM,KAsYhB,SAAe,GAAc,QCvZ7B,IAAU,IAAV,SAAUxB,IAAO,SAAA4c,IAAO,SAAA1E,GACT,EAAA2E,SAAW,CAAC3F,EAAa5jB,IAC7B,GAAYskB,KAAKV,EAAK5jB,EAEhC,CAJuB,GAAA4kB,WAAA,EAAAA,SAAQ,IAI/B,CAJgB,GAAA0E,SAAA,EAAAA,OAAM,IAItB,CAJD,CAAU,QAAM,KAMhB,SAAe,GAAOA,OAAe,SCNtB,MAAME,GAInB,WAAApb,CAAYqb,GACVD,GAAQhE,SAAW7kB,KACnB6oB,GAAQE,SAAWD,EAEnB7vB,EAAY,CACVC,KAAM,QACNtB,MAAO,CACL2B,OAAQ,iBACRlC,SAAUwxB,GAAQG,kBAGxB,CAEA,MAAA9qB,GACA,CAEA,cAAO+qB,CAAQC,EAA2Bpf,EAAiBvT,EAAuB4yB,EAA4BC,EAAsBC,EAAqBC,EAAeC,GACtK,IAAIjuB,EAAO,GAEPguB,IACFhuB,GAAQ,kBAAkBguB,WAG5BhuB,GAAQ,SAASwO,WAEZyf,IACHjuB,GAAQ,wEAGV,IAAIkuB,EAA0BrzB,SAASsF,cAAc,OAmBrD,OAlBA+tB,EAAQjtB,UAAY,WAAyB,MAAd8sB,EAAqBA,EAAa,MAAiB,MAAX9yB,EAAkB,GAAK,mBAAmB6yB,EAAa,cAAgB,MAAMK,GAAgBP,KACpKM,EAAQE,aAAa,iBAAkB,gBACvCF,EAAQ9tB,UAAYJ,EAEhB/E,EACFA,EAAQozB,OAAOH,GAEfrzB,SAAS4D,KAAK6vB,YAAYJ,IAGH,MAArBL,GAA6BA,EAAoB,IACnDtwB,YAAW,W,MACwD,QAAjE,EAAA1C,SAASE,iBAAsB,0CAAkC,SAAE8C,SAAQ5C,GACzEA,EAAQqG,UAEZ,GAAGusB,GAAqB,MAGnB,CACT,CAEA,sBAAOH,CAAgB9uB,GACrBA,EAAE4a,iBACF5a,EAAE2a,kBAEF,IAAIoU,EAAU/uB,EAAEC,OAAOoa,QAAQ,YAI/B,OAHG0U,GACDA,EAAQrsB,UAEH,CACT,EAGF,IAAY6sB,IAAZ,SAAYA,GACV,yBACA,yBACA,oBACD,CAJD,CAAYA,KAAAA,GAAe,K,IC/DjB,G,+mBAAV,SAAU1d,IAAO,SAAAwB,G,MAEf,IAAMsc,EAAI,EAAV,MACE,WAAApc,GAEA,CAEA,MAAAvP,GACEjF,EAAY,CACVC,KAAM,SACNtB,MAAO,CACL2B,OAAQ,YACRlC,SAAU,EAAKyyB,cAInB7wB,EAAY,CACVC,KAAM,SACNtB,MAAO,CACL2B,OAAQ,WACRlC,SAAU,EAAK0yB,kBAGrB,GAEO,EAAAD,WAAoB5vB,GAAM,qC,QAC/BA,EAAE4a,iBACF5a,EAAE2a,kBAEF,MAAMte,EAA2B2D,EAAEC,OAC7BkF,EAAiB,IAAI2qB,SAASzzB,GAC9B0zB,EAAa,cAEbC,EAAyD,QAAlC,EAAA3zB,EAAQwE,WAAW,uBAAe,eAAEC,MAC3DmvB,EAAmB5zB,EAAQH,cAAc,oBAAoB8zB,OAwCnE,OAtCA,GAAYtB,SAAqC,QAA5B,EAAAryB,EAAQwE,WAAmB,cAAC,eAAEC,MAAOqE,GAAM+O,MAAKkB,I,UAOnE,GANI6a,EACF,GAAclB,QAAQ3Z,EAASjQ,KAAKuoB,QAAU6B,GAAgB7B,QAAU6B,GAAgBrrB,MAAOkR,EAASjQ,KAAKyK,QAASqgB,GAEtH,GAAclB,QAAQ3Z,EAASjQ,KAAKuoB,QAAU6B,GAAgB7B,QAAU6B,GAAgBrrB,MAAOkR,EAASjQ,KAAKyK,SAG3GwF,EAASjQ,KAAKuoB,QAChB,GAAItY,EAASjQ,KAAKwoB,QAAS,CACzB,MAAMuC,EAAgD,QAA9B,EAAA7zB,EAAQwE,WAAWkvB,UAAW,eAAEjvB,MAClDqvB,EAAYl0B,SAASC,cAAc,oBAAoBg0B,OAE7D,GAAIC,EAAW,CACbA,EAAU3uB,UAAY4T,EAASjQ,KAAKwoB,QAGpC,MAAMyC,EAA6E,QAA/D,EAAA/zB,EAAQH,cAAgC,8BAAuB,eAAE4E,MACjFsvB,GACF/zB,EAAQmzB,aAAaO,EAAY1zB,EAAQwE,WAAWkvB,GAAYjvB,MAAMiI,QAAQ,IAAIqnB,IAAe,IAErG,CAEA,MAAMC,EAAgE,QAA7C,EAAAh0B,EAAQwE,WAAW,kCAA0B,eAAEC,MACxE,GAAIuvB,EAAkB,CACpB,MAAMF,EAAYl0B,SAASC,cAAc,oBAAoBm0B,OACzDF,GAAWhuB,EAAKguB,GAEpB,MAAMG,EAA0Cr0B,SAASE,iBAAiB,4BAC1E4F,EAAQuuB,EACV,CACF,MAAWlb,EAASjQ,KAAKorB,QACvB5xB,YAAW,WACT8X,SAAS8Z,QACX,GAAG,IAEP,KAGK,CACT,IAEO,EAAAV,gBAAyB7vB,GAAM,qC,QACpCA,EAAE4a,iBACF5a,EAAE2a,kBAEF,MAAM6V,EAAwBxwB,EAAEC,OAC1BkF,EAAiB,IAAI2qB,SAASU,GAC9BR,EAAsD,QAA/B,EAAAQ,EAAK3vB,WAAW,uBAAe,eAAEC,MACxDmvB,EAAmBO,EAAKt0B,cAAc,oBAAoB8zB,OAC1DS,EAA0D,QAAvC,EAAAD,EAAK3vB,WAAW,+BAAuB,eAAEC,MAElE,GAAK2vB,EAeL,OAbA,GAAY/B,SAAS+B,EAAkBtrB,GAAM+O,MAAKkB,IAC5CA,EAASjQ,KAAKuoB,QAChB8C,EAAKE,SAGDT,EACF,GAAclB,QAAQ3Z,EAASjQ,KAAKuoB,QAAU6B,GAAgB7B,QAAU6B,GAAgBrrB,MAAOkR,EAASjQ,KAAKyK,QAASqgB,GAEtH,GAAclB,QAAQ3Z,EAASjQ,KAAKuoB,QAAU6B,GAAgB7B,QAAU6B,GAAgBrrB,MAAOkR,EAASjQ,KAAKyK,QAEjH,KAGK,CACT,IArGI+f,EAAI,MADThsB,GACKgsB,EAuGP,CAzGgB,GAAAtc,UAAA,EAAAA,QAAO,IAyGvB,CAzGD,CAAU,QAAM,K,ICJN,G,wSAAV,SAAUxB,IAAO,SAAAiY,IAAI,SAAAC,IAAS,SAAApf,GAuC5B,IAAYgmB,EAKAC,GALZ,SAAYD,GACV,yCACA,kCACD,CAHD,CAAYA,EAAA,EAAAA,gBAAA,EAAAA,cAAa,KAKzB,SAAYC,GACV,uBACA,2BACA,2BACA,0BACD,CALD,CAAYA,EAAA,EAAAA,YAAA,EAAAA,UAAS,KAOR,EAAAC,aAAe,CAAO1rB,EAAeukB,IAAgC,mCAChF,aAAa,GAAYD,KAAK,2BAA4BtkB,EAAMukB,EAClE,IAEa,EAAAoH,UAAY,IAA0B,mCACjD,aAAa,GAAYrrB,IAAI,cAC/B,GACD,CA1D6B,GAAAkF,SAAA,EAAAA,OAAM,IA0DnC,CA1DoB,GAAAof,WAAA,EAAAA,SAAQ,IA0D5B,CA1DgB,GAAAD,MAAA,EAAAA,IAAG,IA0DnB,CA1DD,CAAU,QAAM,KA4DhB,SAAe,GAAOA,IAAIC,SAAe,OC9DzC,IAAYgH,IAAZ,SAAYA,GACV,0BACA,oBACA,aACD,CAJD,CAAYA,KAAAA,GAAc,KCEnB,MAAM,GAAW,IAAOx0B,OAAO8xB,YAAc,IAQvC2C,GAAiB,CAACrvB,EAA2ByB,IACxDzB,EAAGlD,iBAAiB,eAAgB2E,EAAM,CAAEorB,MAAM,IAOvCyC,GAAY,CAACC,EAAuB9kB,EAAoB+kB,KALzC,CAACjsB,IAC3B,MAAMksB,EAAiBxgB,KAAKD,MAAQ,KACpC1U,SAASW,OAAS,GAAGsI,gBAAmB,IAAI0L,KAAKwgB,GAAgBxc,iCAAiCrY,OAAOka,SAAS4a,UAAU,EAI5HC,CAAallB,GAEb,MAAMmlB,EAAaJ,GAAkB,IAAIvgB,KAEpCugB,GACHI,EAAWC,QAAQD,EAAWvc,UAAY,MAG5C/Y,SAASW,OAAS,GAAGwP,KAAc8kB,eAA2BK,EAAW3c,kCAAkCrY,OAAOka,SAAS4a,UAAU,EAS1HI,GAAiB,CAACtB,EAAWhrB,EAAcnG,EAAe,SAAU0yB,GAAqB,KAChGA,IAAWvB,EAAU3uB,UAAY,IAErC,MAAM8tB,EAAUrzB,SAAS01B,cAAcC,yBAAyBzsB,GAAM0sB,kBAEtE,OAAQ7yB,GACN,IAAK,QACHmxB,EAAU2B,MAAMxC,GAChB,MACF,IAAK,mBACHa,EAAU3uB,UAAY8tB,EAAQ9tB,UAC9B,MAEF,QACE2uB,EAAUT,YAAYJ,GAE1B,EClDK,MAAMyC,GACX,WAAAxe,GACExU,EAAY,CACVC,KAAM,QACNE,OAAQ,CACN,CACExB,MAAO,iBACPP,SAAU2I,KAAKksB,mBAIvB,CAEQ,eAAAA,CAAgBhyB,GACtB,MAAM3D,EAAuB2D,EAAEC,OACzBgyB,EAAW51B,aAAO,EAAPA,EAASge,QAAQ,aAClC4X,SAAAA,EAAUvvB,QACZ,EA6BF,IAAYwvB,G,GA3BH,GAAAC,eAAiB,CAACnD,EAA6Bpf,EAAkBwf,KACtE,MAAMgD,EAAkBxiB,QAAAA,EAAW,iDAC7ByiB,EAAmBrD,QAAAA,EAAYkD,GAAiBhuB,MAChDouB,EAAelD,QAAAA,EAAQ,sBAE7B,IAAI/yB,EAAUJ,SAASsF,cAAc,OACrC,EAAOlF,EAAS,YAChB,EAAOA,EAAS,YAAY61B,GAAiBG,MAE7C,IAAIjxB,EAAO,0DACUkxB,gFAEbF,4KAKR/1B,EAAQmF,UAAYJ,EAEpBnF,SAAS4D,KAAK6vB,YAAYrzB,GAE1BsC,YAAW,KACTtC,EAAQqG,QAAQ,GACf,IAAK,EAIZ,SAAYwvB,GACV,yBACA,yBACA,oBACD,CAJD,CAAYA,KAAAA,GAAgB,KC1C5B,MAAqBK,GAqBnB,gCAAOC,CAA0BC,EAAoBzS,GACnD,MAAM,UAAE0S,EAAS,SAAEhU,GAAa5Y,KAAK6sB,gBAAgBF,GAIrD,OAHkBC,EAAYhU,EACOsB,CAGvC,CAEA,2BAAO4S,CAAqBC,EAAeC,EAAkBC,GAC3D,MAEMC,EAAQH,EAAMG,MAFN,uCAGd,IAAKA,EAEH,OAAOH,EAIT,MAAOI,EAAGC,EAAcC,EAAaC,EAAeC,EAAYC,GAAgBN,EAQ1EO,EALY,IAAIC,KAAKC,aAAaV,EAAQ,CAC9CW,sBAAuB,EACvBC,sBAAuB,IAGQC,OAAOd,GAGxC,OAAIQ,EACK,GAAGC,IAAiBF,IAAaC,IAEjC,GAAGJ,IAAeC,IAAcI,GAE3C,E,MAtDO,GAAAZ,gBAAmBF,IACxB,MAAMoB,EAA+BpB,EAAUv2B,cAAc,yBACvD43B,EAAgCrB,EAAUv2B,cAAc,oBACxD63B,EAA+BtB,EAAUv2B,cAAc,mBAEvD83B,EAA+BH,aAAe,EAAfA,EAAiB7a,aAAa,uBAC7D0Z,EAA2BoB,aAAgB,EAAhBA,EAAkB9a,aAAa,kBAC1D0F,EAA0BqV,aAAe,EAAfA,EAAiB/a,aAAa,iBAM9D,MAAO,CACLgb,cALiB,GAAKC,qBAAqBD,GAM3CtB,UALiB,GAAKuB,qBAAqBvB,GAM3ChU,SALiB,GAAKuV,qBAAqBvV,GAM5C,EAuCY,GAAAuV,qBAAwBC,IACrC,GAAuB,OAAnBA,EAAyB,OAAO,EACpC,MAAMC,EAAcD,EAAenrB,QAAQ,YAAa,IAAIA,QAAQ,IAAK,KACzE,OAAOqrB,WAAWD,EAAY,E,ioBCvDnB,IAAMxpB,GAAM,GAAZ,MAEb,WAAA4I,GAuCA,KAAA8gB,YAAqBr0B,GAAM,mC,sBACzBA,EAAE4a,iBACF5a,EAAE2a,kBAEF,MAAMhZ,EAAkB3B,EAAEC,OAC1B,IAAIie,EAAmB,EAUvB,GAPAvc,EAAGqZ,QAAQsZ,MAAQvD,GAAewD,WAClC5yB,EAAG6tB,aAAa,WAAY,YAEiB,IAAzC7tB,EAAGxF,iBAAiB,UAAUiC,QAChCuD,EAAG+tB,YAAYzzB,SAASsF,cAAc,QAAQkB,UAAUE,IAAI,SAG1DhB,EAAGqZ,QAAQwZ,cAAe,CAC5B,MAAMA,EAAgBv4B,SAASC,cAAcyF,EAAGqZ,QAAQwZ,eACpDA,IACFtW,EAAWuW,SAASD,EAAc1zB,OAEtC,CAEA,MAAM4zB,EAA4B,EAAQ,oCACpCC,EAA0C,OAAd,QAAV,EAAAhzB,EAAGqZ,eAAO,eAAE4Z,UAC9BC,EAA4B,QAAV,EAAAlzB,EAAGqZ,eAAO,eAAE8Z,gBACpC,IAAI/a,EAAwC,MAC9B,QAAV,EAAApY,EAAGqZ,eAAO,eAAE+Z,YACdhb,EAAa,CACX,CAAC,GAAc6W,UAAUoE,UAAqB,QAAV,EAAArzB,EAAGqZ,eAAO,eAAE+Z,iBAG9C,GACHlE,aACC,CACEzP,KAAM,CACJ,CACExX,UAAqB,QAAV,EAAAjI,EAAGqZ,eAAO,eAAEia,UACvBpa,cAAyB,QAAV,EAAAlZ,EAAGqZ,eAAO,eAAEka,cAC3BC,UAAWjX,EACXkX,aAAc,CACZzrB,SAAUhI,aAAE,EAAFA,EAAIqZ,QAAQqa,uBACtB9b,OAAQ5X,aAAE,EAAFA,EAAIqZ,QAAQsa,qBACpBC,oBAAqBV,GAEvBW,oBAAqB,CACnBC,SAAqB,QAAX,EAAA9zB,aAAE,EAAFA,EAAIqZ,eAAO,eAAE4Z,UAEzB7a,WAAYA,KAIR,QAAV,EAAApY,EAAGqZ,eAAO,eAAE0O,OAEbxV,MAAMkB,I,MAEL,GADA,GAAOuV,SAAS+K,aAAatgB,GACX,QAAd,EAAAA,aAAQ,EAARA,EAAUjQ,YAAI,eAAEyK,QAAS,CAE3B,IAAI+lB,EAAe5E,GAAe6E,MACJ,IAA1BxgB,EAASjQ,KAAKuoB,SAChBiI,EAAe5E,GAAe8E,QAC1BlB,GACF7uB,KAAKgwB,yBAAyBjB,GAGhC,EAAOH,EAAc,UACrB1D,GAAe0D,GAAc,KAC3BtyB,EAAUsyB,EAAc,SAAS,KAGnC3C,GAASI,eAAeD,GAAiBhuB,MAAOkR,EAASjQ,KAAKyK,SAEhEjO,EAAGqZ,QAAQsZ,MAAQqB,CACrB,KAEDI,OAAM,KAELp0B,EAAGqZ,QAAQsZ,MAAQvD,GAAe6E,IAAI,IAG1Cj0B,EAAGsZ,gBAAgB,YAGnBtc,YAAW,KACTgD,EAAGsZ,gBAAgB,cACnBtZ,EAAGzF,cAAc,UAAUwG,QAAQ,GAClC,KAUH,MAPkC,MADGgyB,EAAax4B,cAAc,sCAC5C85B,WAAqBr0B,EAAGqZ,QAAQsZ,OAASvD,GAAe6E,OACkB,QAA3F,EAAA35B,SAASC,cAAc,4DAAoE,SAAE0qB,QAC9FjoB,YAAW,KACT+1B,EAAa9N,OAAO,GACnB,OAGE,CACT,IAEA,KAAAqP,kBAA2Bj2B,GAAM,mC,gBAC/BA,EAAE4a,iBACF5a,EAAE2a,kBAEF,MAAMte,EAAuB2D,EAAEC,OACzBi2B,EAAgB75B,aAAO,EAAPA,EAASge,QAAQ,oCAEjC0I,EAA8B,QAAtB,EAAAmT,aAAa,EAAbA,EAAelb,eAAO,eAAEmb,MAChCjY,EAAmC,OAAT,QAAf,EAAA7hB,EAAQ2e,eAAO,eAAErY,KAAc,GAAK,EAC/CyzB,EAA4C,QAArB,EAAAF,EAAclb,eAAO,eAAEqb,qBA6BpD,aA5BM,GACHxF,aACC,CACEzP,KAAM,CACJ,CACE2B,MAAOA,EACPoS,UAAWjX,EACXsX,oBAAqB,CACnBC,SAAUW,GAEZhB,aAAc,CACZzrB,SAA+B,QAArB,EAAAusB,EAAclb,eAAO,eAAEqa,uBACjC9b,OAA6B,QAArB,EAAA2c,EAAclb,eAAO,eAAEsa,qBAC/BC,oBAA0C,QAArB,EAAAW,EAAclb,eAAO,eAAE8Z,oBAKpDoB,aAAa,EAAbA,EAAelb,QAAe,OAE/B9G,MAAMkB,I,MACL,GAAOuV,SAAS+K,aAAatgB,IACX,QAAd,EAAAA,aAAQ,EAARA,EAAUjQ,YAAI,eAAEyK,WAAYwF,EAASjQ,KAAKuoB,SAC5C,GAAcqB,QAAQQ,GAAgBrrB,MAAOkR,EAASjQ,KAAKyK,QAAS,KAAM,IAAM,KAAM,KAAM,MAAM,EACpG,IAEDmmB,OAAM,UAEF,CACT,IAEA,KAAAO,eAAwBt2B,GAAM,mC,cAC5BA,EAAE4a,iBACF5a,EAAE2a,kBAEF,MAAMte,EAA4B2D,EAAEC,OAC9Bi2B,EAAgB75B,aAAO,EAAPA,EAASge,QAAQ,oCACjC0I,EAA8B,QAAtB,EAAAmT,aAAa,EAAbA,EAAelb,eAAO,eAAEmb,MAChCjY,EAAmBuW,SAASp4B,EAAQyE,OACpCs1B,EAA4C,QAArB,EAAAF,EAAclb,eAAO,eAAEqb,qBA2BpD,aAzBM,GACHxF,aACC,CACEzP,KAAM,CACJ,CACE2B,MAAOA,EACPwT,OAAQrY,EACRsX,oBAAqB,CACnBC,SAAUW,GAEZhB,aAAc,CACZzrB,SAA+B,QAArB,EAAAusB,EAAclb,eAAO,eAAEqa,uBACjC9b,OAA6B,QAArB,EAAA2c,EAAclb,eAAO,eAAEsa,qBAC/BC,oBAA0C,QAArB,EAAAW,EAAclb,eAAO,eAAE8Z,oBAKpDoB,aAAa,EAAbA,EAAelb,QAAQ0O,OAExBxV,MAAMkB,IACL,GAAOuV,SAAS+K,aAAatgB,EAAS,IAEvC2gB,OAAM,UAEF,CACT,IAEA,KAAAS,kBAA2Bx2B,GAAM,mC,YAC/BA,EAAE4a,iBACF5a,EAAE2a,kBAEF,MAAMte,EAAuB2D,EAAEC,OACzBi2B,EAAgB75B,aAAO,EAAPA,EAASge,QAAQ,oCAwBvC,aAtBM,GACHwW,aACC,CACEzP,KAAM,CACJ,CACE2B,MAA6B,QAAtB,EAAAmT,aAAa,EAAbA,EAAelb,eAAO,eAAEmb,MAC/BI,OAAQ,EACRnB,aAAc,CACZzrB,SAA+B,QAArB,EAAAusB,EAAclb,eAAO,eAAEqa,uBACjC9b,OAA6B,QAArB,EAAA2c,EAAclb,eAAO,eAAEsa,qBAC/BC,oBAA0C,QAArB,EAAAW,EAAclb,eAAO,eAAE8Z,oBAKpDoB,EAAclb,QAAQ0O,OAEvBxV,MAAMkB,IACL,GAAOuV,SAAS+K,aAAatgB,EAAS,IAEvC2gB,OAAM,UAEF,CACT,IAuBA,KAAAL,aAAgBtgB,I,cACd,GAAwB,MAApBA,aAAQ,EAARA,EAAUG,SAAmC,OAAlBH,aAAQ,EAARA,EAAUjQ,MAAc,CACrD,MACMsxB,EAD+B,EAAQ,mBACXC,UAC5BhC,EAA4B,EAAQ,oCACpCiC,EAA0B,EAAQ,kCAClCC,EAA4BlC,EAAax4B,cAAc,mCACvD26B,EAA+BnC,EAAax4B,cAAc,sCAC1D46B,EAA8B76B,SAASC,cAAc,sCA8B3D,IA5BkB,QAAd,EAAAkZ,aAAQ,EAARA,EAAUjQ,YAAI,eAAE4xB,eAAgB,GAC9BH,IACFA,EAAap1B,UAAkC,QAAtB,EAAc,QAAd,EAAA4T,aAAQ,EAARA,EAAUjQ,YAAI,eAAE+E,cAAM,eAAE8sB,qCAI/CH,IACFA,EAAgBr1B,UAA0B,QAAd,EAAA4T,aAAQ,EAARA,EAAUjQ,YAAI,eAAE4xB,cAC5C/0B,EAAK60B,EAAiB,SAEpBC,GACFA,EAAe7b,gBAAgB,cAG7B4b,GACF10B,EAAK00B,GAGHD,IAEFA,EAAap1B,UAAYo1B,EAAa5b,QAAQic,YAG5CH,GACFA,EAAetH,aAAa,WAAY,aAIxCmH,IAA0C,KAAd,QAAd,EAAAvhB,aAAQ,EAARA,EAAUjQ,YAAI,eAAEuoB,SAAkB,CAClDiJ,EAAWn1B,UAAY4T,EAASjQ,KAAKwoB,QAErC,MAAMuJ,EAAkC,EAAQ,mBAC5CT,EAAY,GAAKS,EAAmBR,WAAaD,GACnDS,EAAmBC,SAAS,EAAGV,EAEnC,CACF,CAEA,OAAO,CAAK,EAGN,KAAAW,eAAkBC,IACxB,MAAMC,EAAkB,EAAQ,2BAC1B9C,EAAgBp4B,EAAWk7B,EAAiB,aAC5CV,EAA4Bx6B,EAAWk7B,EAAiB,sBACxDrwB,EAAQ2vB,aAAY,EAAZA,EAAc5d,aAAa,oBACnC0Z,EAAY0B,WAAWntB,aAAK,EAALA,EAAO8B,QAAQ,IAAK,MAC3CgqB,EAAiB,OAAR92B,eAAQ,IAARA,cAAQ,EAARA,SAAUgtB,gBAAgBjQ,aAAa,gBAEtD,IAAIkF,EAAW,EAWf,GATIsW,IACE6C,EACF7C,EAAc+C,SAEd/C,EAAcgD,WAEhBtZ,GAAYsW,EAAc1zB,OAGxB81B,GAAgBlE,GAAaxU,EAAU,CACzC,MAAM4U,EAAW,GAAYF,qBAAqBgE,EAAaZ,UAAWtD,EAAYxU,EAAU6U,GAC5FD,IACF8D,EAAaZ,UAAYlD,EAE7B,CAEA,OAAO,CAAK,EAGN,KAAAgD,yBAA4BlsB,I,MAClC,MAAM6tB,EAAiB,EAAQ,uDAAuD7tB,OACtF6tB,SAAAA,EAAgB7Q,QAEhB,MAAM8Q,EAAe,EAAQ,wCACvBC,EAAwC,QAArB,EAAAD,aAAY,EAAZA,EAAc1c,eAAO,eAAE4c,aAEhD,GAAID,GAAsD,QAAlCA,EAAiB16B,cAAyB,CAChE,MAAM46B,EAAoB,IAAIl6B,YAAY,qBAAsB,CAAEm6B,SAAS,EAAMC,YAAY,IAC7F97B,SAAS4B,cAAcg6B,EACzB,GAtWA,GAAOlN,SAAW7kB,KAClB/G,EAAY,CACVC,KAAM,QACNE,OAAQ,CACN,CACEG,OAAQ,cACRlC,SAAU2I,KAAKuuB,aAEjB,CACEh1B,OAAQ,mBACRlC,SAAU2I,KAAKmwB,mBAEjB,CACE52B,OAAQ,mBACRlC,SAAU2I,KAAK0wB,mBAEjB,CACEn3B,OAAQ,oBACRlC,SAAU2I,KAAKkyB,oBAEjB,CACE34B,OAAQ,oBACRlC,SAAU2I,KAAKmyB,uBAKrBl5B,EAAY,CACVC,KAAM,SACNtB,MAAO,CACL2B,OAAQ,gBACRlC,SAAU2I,KAAKwwB,iBAGrB,CAEA,MAAAtyB,GAAU,CAmNV,kBAAAg0B,GAEE,OADA,GAAOrN,SAASyM,gBAAe,IACxB,CACT,CAEA,kBAAAa,GAEE,OADA,GAAOtN,SAASyM,gBAAe,IACxB,CACT,GAEO,GAAAc,UAAY,IAAY,qCAQ7B,aAPM,GACHpH,YACA5c,MAAMkB,IACL,GAAOuV,SAAS+K,aAAatgB,EAAS,IAEvC2gB,OAAM,UAEF,CACT,IA7QmBprB,GAAM,OAD1BhH,GACoBgH,I,uTCTd,MCEM,GAAW3O,GAAkBC,SAASC,cAAmBF,G,8UCA/D,IAAMm8B,GAAU,GAAhB,MAKL,WAAA5kB,GAHQ,KAAA6kB,YAA2B,GAAQ,gBACnC,KAAAC,kBAAiC,GAAQ,iCAG/C,GAAW1N,SAAW7kB,IACxB,CAEA,MAAA9B,G,MACiC,QAA/B,KAAW2mB,SAASyN,mBAAW,SAAE35B,iBAAiB,YAAaqH,KAAKwyB,kBACtE,CAEQ,iBAAAA,GACN,IAAIC,EAAiBzzB,KAAKoQ,MAAM,GAAWyV,SAASyN,YAAYI,YAC5DC,EAAa,GAAW9N,SAASyN,YAAYM,YAAc,GAAW/N,SAASyN,YAAYO,YAE3F,GAAKJ,EAAiBE,GAAcF,EAAiBE,GAAc,EACrE,GAAW9N,SAAS0N,kBAAkBx2B,MAAM+2B,YAAY,mBAAoB,QAE5E,GAAWjO,SAAS0N,kBAAkBx2B,MAAM+2B,YAAY,mBAAoB,QAEhF,GAtBWT,GAAU,OADtBx0B,GACYw0B,I,8UCCE,IAAMU,GAAI,GAAV,MAKb,WAAAtlB,GAHQ,KAAAulB,WAA0B78B,SAASC,cAAc,wBACjD,KAAA68B,UAAyB98B,SAASC,cAAc,0BA0ChD,KAAA88B,cAAiBh5B,I,QACnB3D,EAAU2D,EAAEC,OAEX5D,EAAQiV,aAAa,iBAAgBjV,EAAUA,EAAQid,eAE5D,MACMrZ,EAA0C,QAAjC,EAAA5D,EAAQwE,WAAW,sBAAc,eAAEC,MAC5Cm4B,EAAuD,QAA3C,EAAA58B,EAAQwE,WAAW,gCAAwB,eAAEC,MACzDqvB,EAAYl0B,SAASC,cAAc,oBAAoB+D,MACvDi5B,EAA2B,SAAbD,EAEdE,EAAyBl9B,SAASC,cAAc,gEAChDk9B,EAA0Bn9B,SAASC,cAAc,iEAEvD,IAAIm9B,EAAiBH,EATQ,SAUzBI,EAAyBnJ,EAAUqI,WAAaa,EACpD,MAAMV,EAAsBxI,EAAUwI,YAChCY,EAAuBZ,GAAeW,EAAiBnJ,EAAUuI,aAEjEc,EAAqB,UA2B3B,OAzBIN,GAAeK,EAAeF,GAChCA,GAAUE,EACVD,GAAkBC,IACRL,GAAeI,EAAiBC,IAC1CF,GAAUE,EACVD,GAAkBC,GAGpBpJ,EAAUsJ,SAAS,CACjBC,KAAML,EACNM,SAAU,WAGRL,GAAkB,EACpBl3B,EAAU+2B,EAAWK,GAErB,EAAOL,EAAWK,GAGhBb,GAAeW,EAAiBnJ,EAAUuI,YAC5Ct2B,EAAUg3B,EAAYI,GAEtB,EAAOJ,EAAYI,IAGd,CAAK,EAGN,KAAAI,mBAAsB55B,IAC5BA,EAAE4a,iBACF5a,EAAE2a,kBACF,MAAMte,EAAU2D,EAAEC,OAElB,GAA8B,MAA1B5D,EAAQ2e,QAAQ/a,OAAgB,CAClC,GAAK45B,sBAAsBx9B,EAAQ25B,WAEnC,MAAM8D,EAAe79B,SAASC,cAAc,oBAAoBG,EAAQ2e,QAAQ/a,WAEhF,GAAI65B,EAAc,CAChB,GAAKC,wBAEL,MAAMC,EAAgB/9B,SAASC,cAAc,cAC7CkG,EAAU43B,EAAe,aACzB,EAAOA,EAAe,cACtB,EAAOF,EAAc,aAErBh0B,KAAKm0B,oBACP,CACF,GAGM,KAAAC,WAAcl6B,IACpBA,EAAE4a,iBACF5a,EAAE2a,kBAEF,MAAMte,EAAU2D,EAAEC,OACZkwB,EAAY9zB,aAAO,EAAPA,EAASge,QAAQ,cAC7B8f,EAAS99B,aAAO,EAAPA,EAASge,QAAQ,eAE5B8V,IACF/tB,EAAU+tB,EAAW,aACrB,GAAKiK,+BACL,GAAKL,yBAGHI,IACF/3B,EAAU+3B,EAAQ,cAClB,EAAOA,EAAQ,aACjB,EAwBM,KAAAE,wBAA0B,KAC5Bv0B,KAAKgzB,WAAWwB,aAAex0B,KAAKgzB,WAAWpC,UAAY5wB,KAAKgzB,WAAWyB,aAAe,GAE5Fn4B,EAAU0D,KAAKgzB,WAAY,UAClBhzB,KAAKgzB,WAAWpC,UAAY,EAErC,EAAO5wB,KAAKgzB,WAAY,CAAC,SAAU,QAGnC12B,EAAU0D,KAAKgzB,WAAY,MAC7B,EAGM,KAAA0B,qBAAiC,GArKvC,GAAK7P,SAAW7kB,IAClB,CAEA,MAAA9B,GACEjF,EAAY,CACVC,KAAM,QACNE,OAAQ,CACN,CACExB,MAAO,uBACPP,SAAU2I,KAAK8zB,oBAEjB,CACEl8B,MAAO,cACPP,SAAU2I,KAAKo0B,YAEjB,CACEx8B,MAAO,kBACPP,SAAU2I,KAAKkzB,kBAKrBlzB,KAAK20B,iBACP,CAEQ,eAAAA,GACN,MAAMC,EAAUz+B,SAASC,cAAc,+BACjCy+B,EAAW1+B,SAASE,iBAAiB,sBAE3C,IAAIy+B,GAAU,EACdD,SAAAA,EAAU17B,SAAS47B,KAEZD,GADQC,EACUC,UAAYJ,EAAQI,YACzCD,EAAQp4B,UAAUE,IALQ,cAM1Bi4B,GAAU,EACZ,GAEJ,CA8FQ,kBAAAX,G,MAQN,GANe,QAAf,EAAAn0B,KAAKgzB,kBAAU,SAAEh5B,oBAAoB,SAAUgG,KAAKu0B,yBAGpDv0B,KAAKgzB,WAAa78B,SAASC,cAAc,wBACzC4J,KAAKizB,UAAY98B,SAASC,cAAc,2BAEnC4J,KAAKgzB,aAAehzB,KAAKizB,UAAW,OAEzC,MAAMgC,EAASx+B,OAAOy+B,YAAcl1B,KAAKizB,UAAUj2B,aAG/CgD,KAAKgzB,WAAWwB,cAAgBS,IAEpCj1B,KAAKgzB,WAAWj3B,MAAM+2B,YAAY,kBAAmB,GAAG9yB,KAAKizB,UAAUj2B,kBAEvEgD,KAAKgzB,WAAWr6B,iBAAiB,SAAUqH,KAAKu0B,wBAAwBntB,KAAKpH,MAAO,CAAEm1B,SAAS,IAC/Fn1B,KAAKu0B,0BACP,GAiBc,GAAAN,sBAAwB,KACpC,MAAMmB,EAAuBj/B,SAASE,iBAAiB,uCAEvD++B,SAAAA,EAAsBj8B,SAAS0C,IAC7BA,EAAGH,UAAY,GACf,GAAKmpB,SAAS6P,qBAAqBv7B,SAAQ,CAACk8B,EAAU/1B,KACpD,MAAMg2B,EAASh2B,IAAU,GAAKulB,SAAS6P,qBAAqBp8B,OAAS,EAC/Di9B,EAAcp/B,SAASsF,cAAc,QAI3C,GAFA85B,EAAYC,YAAcH,EAErBC,EAMHz5B,EAAG+tB,YAAY2L,OANJ,CACX,MAAME,EAAiBt/B,SAASsF,cAAc,KAC9Cg6B,EAAel5B,UAAY,4CAC3BV,EAAG+tB,YAAY2L,GACf15B,EAAG+tB,YAAY6L,EACjB,CAEA,GACA,GACF,EAGU,GAAA1B,sBAAyB2B,IACrC,GAAK7Q,SAAS6P,qBAAqB57B,KAAK48B,EAAK,EAGjC,GAAApB,6BAA+B,KACvC,GAAKzP,SAAS6P,qBAAqBp8B,OAAS,GAAG,GAAKusB,SAAS6P,qBAAqBiB,KAAK,EAzM1E5C,GAAI,OADxBl1B,GACoBk1B,I,2UCAN,IAAM6C,GAAN,MAIb,WAAAnoB,GAHQ,KAAAqb,SAAmB,WAgB3B,KAAA+M,cAAiB37B,I,MACfA,EAAE2a,kBAEF,MAAM1a,EAASD,EAAEC,OACjB6F,KAAK81B,YAAkC,QAApB,EAAA37B,EAAOqZ,qBAAa,eAAEpd,cAA2B,mCAC/D4J,KAAK81B,cAEV54B,EAAY8C,KAAK81B,YAAa91B,KAAK8oB,U7BYf,EAACjtB,EAAiBU,KAAqB,MAAC,OAAa,QAAb,EAAAV,aAAE,EAAFA,EAAIc,iBAAS,eAAE4pB,SAAShqB,EAAU,E6BV1Fw5B,CAAS/1B,KAAK81B,YAAa91B,KAAK8oB,YAClC3yB,SAASwC,iBAAiB,QAASqH,KAAKg2B,cACxC7/B,SAASwC,iBAAiB,SAAUqH,KAAKg2B,eAC3C,EAGF,KAAAA,aAAgB97B,IACd,MAAMC,EAASD,EAAEC,OAEF,UAAXD,EAAEhB,MAAoB8G,KAAK81B,YAAYvP,SAASpsB,KAEpDmC,EAAU0D,KAAK81B,YAAa91B,KAAK8oB,UACjC9oB,KAAK81B,YAAc,KACnB91B,KAAKi2B,uBAAsB,EAG7B,KAAAA,qBAAuB,KACrB9/B,SAAS6D,oBAAoB,QAASgG,KAAKg2B,cAC3C7/B,SAAS6D,oBAAoB,SAAUgG,KAAKg2B,aAAa,CAxC5C,CACf,MAAA93B,GACEjF,EAAY,CACVC,KAAM,QACNE,OAAQ,CACN,CACExB,MAAO,mBACPP,SAAU2I,KAAK61B,iBAIvB,GAfmBD,GAAe,IADnC/3B,GACoB+3B,I,qnBCSrB,IAAMM,GAAM,GAAZ,MAQE,WAAAzoB,GANQ,KAAA0oB,OAAsBhgC,SAASC,cAAc,UAC7C,KAAAggC,YAAcjgC,SAASC,cAAc,QACrC,KAAAigC,OAAiB,KAAa,EAAI,GAClC,KAAAC,UAAYngC,SAASE,iBAAiB,yEAmD9C,KAAAkgC,kBAA2Br8B,GAAM,mCAC/BA,EAAE4a,iBACF5a,EAAE2a,kBAEF,MAAM2hB,EAAargC,SAASE,iBAAiB,iBACvCogC,EAAetgC,SAASC,cAAc,iCAE5CogC,SAAAA,EAAYr9B,SAASu9B,I,MAC0C,QAA5D,EAAAA,EAAMtgC,cAAc,gCAAwC,SAAE0qB,OAAO,IAGxE,MAAMvqB,EAAuB2D,EAAEC,OAE3Bs8B,IACFz2B,KAAK22B,mBAAmBpgC,GACxBA,EAAQuqB,eLnF0C,qCACtD,aAAa,GAAYnhB,IAAI,mBAC/B,IKoFOyO,MAAMkB,I,OACY,QAAb,EAAAA,EAASjQ,YAAI,eAAEu3B,cAAergC,IAChCJ,SAAS4D,KAAK88B,mBAAmB,YAAavnB,EAASjQ,KAAKu3B,aAC5D,EAAOzgC,SAAS4D,KAAM,QACtBiG,KAAK22B,mBAAmBpgC,GAC1B,IAED05B,OAAO7xB,IACY,GAExB,IAEA,KAAAu4B,mBAAsBpgC,IACpBA,EAAQ4e,gBAAgB,eACxB5e,EAAQ2e,QAAQtd,MAAQ,SACxBrB,EAAQ2e,QAAQ4hB,QAAU,GAC1BvgC,EAAQ2e,QAAQ/a,OAAS,KAAa,yBAA2B,cAAc,EAGzE,KAAA48B,eAAiB,IAChBtgC,OAAOka,SAAS8D,KAAKxQ,QAAQ,WAAa,EAG3C,KAAA+yB,sBAAwB,KAC9B,MAAMC,EAAc9gC,SAASC,cAAc,uCAC3C6gC,SAAAA,EAAanW,OAAO,EA1FpB,GAAO+D,SAAW7kB,KAClB,GAAOoyB,WACT,CAEA,MAAAl0B,GAKEjF,EAAY,CACVC,KAAM,QACNE,OAAQ,CACN,CACEG,OAAQ,sBACRlC,SAAU2I,KAAKu2B,sBAKrBpgC,SAASwC,iBAAiB,SAAUqH,KAAKk3B,SAAS9vB,KAAKpH,OACvD7J,SAASwC,iBAAiB,oBAAoB,KACxCqH,KAAK+2B,kBACP/2B,KAAKg3B,uBACP,IT1C0BvgC,OAAO8xB,YAAc,OS8C/CvoB,KAAKs2B,UAAUn9B,SAASE,IACtBA,EAAKV,iBAAiB,cAAc,KAClCqH,KAAKm3B,MAAQt+B,YAAW,IAAM,EAAOmH,KAAKo2B,YAAa,iBAAiB,IAAI,GAC5E,IAGJp2B,KAAKs2B,UAAUn9B,SAASE,IACtBA,EAAKV,iBAAiB,cAAc,KAClC2D,EAAU0D,KAAKo2B,YAAa,gBAC5Bx4B,aAAaoC,KAAKm3B,MAAM,GACxB,IAGR,CAEA,QAAAD,GACEzgC,OAAO2gC,QAAUp3B,KAAKq2B,OAASr2B,KAAKm2B,OAAOx5B,UAAUE,IAAI,aAAemD,KAAKm2B,OAAOx5B,UAAUC,OAAO,aACrGnG,OAAO2gC,QAAUp3B,KAAKq2B,OAASlgC,SAAS4D,KAAK4C,UAAUE,IAAI,iBAAmB1G,SAAS4D,KAAK4C,UAAUC,OAAO,gBAC/G,GAtDIs5B,GAAM,OAFXr4B,GAEKq4B,I,8UCRS,IAAMmB,GAAQ,GAAd,MAIb,WAAA5pB,GAFA,KAAA6pB,gBAA0B,GA8H1B,KAAAC,WAAa,CAACtU,EAAayS,KACzB,MAAM8B,EAAOrhC,SAASsF,cAAc,KACpC+7B,EAAK/iB,KAAOwO,EACZ,MAAMwU,EAAc/B,EAAKt/B,cAAc,iBACvCohC,EAAK97B,UAAY+7B,EAAY/7B,UAC7B,EAAO87B,EAAM,gBACbC,EAAYx8B,WAAWU,aAAa67B,EAAMC,EAAY,EAgExD,KAAAC,sBAAyBnhC,IACvB,MAAMohC,EAA+BrhC,EAAWC,aAAO,EAAPA,EAASid,cAAe,0CACpEmkB,GAAiBA,EAAgBxiB,gBAAgB,WAAW,EAGlE,KAAAyiB,qBAAuB,CAACC,EAAqC/zB,EAAmBiR,EAAuB+iB,KAChGD,GAAe/zB,GAEpB+zB,EAAW1+B,SAAS4+B,IAClBA,EAAO7iB,QAAQia,UAAYrrB,EAC3Bi0B,EAAO7iB,QAAQka,cAAgBra,EAC/BgjB,EAAO7iB,QAAQ+Z,SAAW6I,CAAQ,GAClC,EAGJ,KAAAE,qBAAuB,CAACC,EAAgCljB,KACtD,IAAKkjB,IAAUljB,EAAe,OAEFvY,MAAM4jB,KAAK6X,GAAOrd,QAAQsd,GAASA,EAAK1sB,aAAa,kBAC7DrS,SAAS++B,IAC3BA,EAAK/iB,gBAAgB,eAAe,IAGd3Y,MAAM4jB,KAAK6X,GAAOrd,QAAQsd,GAASA,EAAKhlB,aAAa,oBAAsB6B,IACnF5b,SAAS++B,IACvBA,EAAKxO,aAAa,eAAgB,OAAO,GACzC,EAGJ,KAAAyO,WAAa,CAACR,EAA8BphC,EAAsB6hC,EAAmBC,K,QACnF,IAAKV,IAAoBphC,EAAS,OAElCohC,EAAgBj8B,UAAYnF,EAAQmF,UACpC28B,EAAet9B,WAAW,kBAAkBC,MAA8D,QAAtD,EAAAzE,EAAQH,cAAc,wCAAgC,eAAEsF,UAC5Gi8B,EAAgBziB,QAAQla,MAAQzE,EAAQ2e,QAAQla,MAChD,MAAMs9B,EAAsG,QAAxF,EAAAX,EAAgBvhC,cAAc,+BAA+B2E,WAAW,wBAAgB,eAAEC,MAI9G,GAFIs9B,IAAaD,EAAet9B,WAAW,iBAAiBC,MAAQs9B,GAE/DF,EAIE,CACL,MAAMj3B,EAAqB7K,EAAWqhC,EAAiB,UACjDY,EAAY,oDAAoDp3B,aAAK,EAALA,EAAOzF,kFAC7EL,EAAY8F,EAAOo3B,EACrB,KARe,CACb,MAAMC,EAAwBliC,EAAWqhC,EAAiB,aACpDc,EAAe,0BAA0BD,aAAQ,EAARA,EAAU98B,2EACzDL,EAAYm9B,EAAUC,EACxB,CAIA,EAGF,KAAAC,4BAA8B,CAACrE,EAAqBsE,KAClD,MAAMC,EAAwBtiC,EAAW+9B,EAAQ,yBAC3CsD,EAA+BrhC,EAAWsiC,EAAU,yBAC1D,IAAKjB,EAAiB,OACtB,MAAMkB,EAAgCviC,EAAWqhC,EAAiB,aAC5DmB,EAA6BxiC,EAAWqhC,EAAiB,UACzDx2B,EAAqB7K,EAAWqiC,EAAuB,UACvDH,EAAwBliC,EAAWqiC,EAAuB,aAC5Dx3B,IACFA,EAAM+uB,UAAY4I,EAAc5I,WAE9BsI,IACFA,EAAStI,UAAY2I,EAAiB3I,UACxC,EAGF,KAAA6I,cAAiBC,I,QACf97B,EAAY87B,EAAQ,kBACpBh5B,KAAKs3B,gBAA+F,QAA5E,EAAqD,QAAtD,EAAC0B,EAAO5iC,cAAc,wBAAgC,eAAE8c,aAAa,gBAAQ,eAAEhU,UAAU,EAGlH,KAAA+5B,aAAgBD,I,MACd97B,EAAY87B,EAAQ,kBACkC,QAArD,EAAAA,EAAO5iC,cAAc,wBAAgC,SAAEszB,aAAa,QAAS1pB,KAAKs3B,gBAAgB,EA1QnG,GAASzS,SAAW7kB,IACtB,CAEA,MAAA9B,GACEjF,EAAY,CACVC,KAAM,QACNE,OAAQ,CACN,CACExB,MAAO,qBACPP,SAAU2I,KAAKk5B,mBAEjB,CACEthC,MAAO,YACPP,SAAU2I,KAAKm5B,wBAAwB/xB,KAAKpH,OAE9C,CACEpI,MAAO,YACPP,SAAU2I,KAAKo5B,8BAEjB,CACExhC,MAAO,WACPP,SAAU2I,KAAKq5B,qBAAqBjyB,KAAKpH,OAE3C,CACE3I,SAAU2I,KAAKq5B,yBAKrBljC,SAASwC,iBAAiB,0BAA0B,KAClDqH,KAAKq5B,sBAAsB,GAE/B,CAEA,iBAAAH,CAAkBh/B,G,YAChBA,EAAE4a,iBAEF,IAAI3a,EAASD,aAAC,EAADA,EAAGC,OAChB,MAAMk6B,EAA8B,QAArB,EAAAl6B,aAAM,EAANA,EAAQqZ,qBAAa,eAAEA,cAEtC,GAAI6gB,GAAUl6B,EAAQ,CACpB,MAAMm/B,EAA6C,QAA/B,EAAAn/B,EAAOY,WAAW,qBAAa,eAAEC,MAC/Cu+B,EAAwE,QAA3D,EAAAp/B,EAAO/D,cAAc,8CAAsC,eAAEsF,UAC1E89B,EAAkBnF,EAAOj+B,cAAc,2CAEzCojC,IACFA,EAAgB99B,UAAY69B,EAC5BC,EAAgBtkB,QAAe,MAAIokB,GAGrCjF,EAAOlf,gBAAgB,QACvBkf,EAAO13B,UAAUC,OAAO,QAExB,MAAM68B,EAA8D,QAAhD,EAAAD,aAAe,EAAfA,EAAiBz+B,WAAW,4BAAoB,eAAEC,MAEtE,GAAIy+B,EAAa,CACf,MAAM7hC,EAAQ,IAAI4Q,MAAMixB,EAAa,CAAEzH,SAAS,EAAMC,YAAY,IAClEuH,SAAAA,EAAiBzhC,cAAcH,EACjC,CACF,CAEA,OAAO,CACT,CAEA,uBAAAuhC,CAAwBj/B,G,YACtB,GAAS2qB,SAASwU,uBAElB,MAAM9iC,EAAuB2D,aAAC,EAADA,EAAGC,OAC1Bk6B,EAAsB99B,EAAQge,QAAQ,mCACtCmhB,EAAoBrB,EAAOj+B,cAAc,sBACzC+F,EAAwBk4B,EAAOj+B,cAAc,aAC7C4iC,EAAsBziC,EAAQge,QAAQ,yCAEtC0O,EAAiF,QAAlE,EAA4D,QAA7D,EAACoR,EAAOj+B,cAAc,yBAAuC,eAAEqe,YAAI,QAAI,KACrFilB,EAAqBrF,EAAO7oB,aAAa,wBAI/C,GAFIwtB,GAAU,MAAYh5B,KAAK+4B,cAAcC,GACzC/V,GAAO,IAAUjjB,KAAKu3B,WAAWtU,EAAKyS,GACrCrB,GAAWqB,GAASv5B,IACpB,MAAY,EAAOA,EAAU,WAC9Bu9B,IAAWnjC,EAAQ2e,QAAQtd,MAAQ,aAElC89B,EAAKlqB,aAAa,YACrB,GAAI,OAAekuB,EAAW,CAE5B,IAAIC,EAAkCxjC,SAASC,cAAc,uCACzDwjC,GAAe,EACdD,GAMHA,EAAmBzJ,UAAY,GAC/ByJ,EAAmBh9B,UAAUE,IAAI,aANjC88B,EAAqBxjC,SAASsF,cAAc,OAC5Ck+B,EAAmBh9B,UAAUE,IAAI,qCAAsC,sBAAuB,WAC9F88B,EAAmBjQ,aAAa,iBAAkB,gBAClDkQ,GAAe,GAMjB,MAAMC,EAAyBnE,EAAKoE,WAAU,GAC9CD,EAAUnQ,aAAa,UAAW,IAClCmQ,EAAU1kB,gBAAgB,cAE1B,MAAM4iB,EAEmD,QADvD,EAAwD,QAAxD,EAAA1D,EAAOj+B,cAAc,2CAAmC,QACxDi+B,EAAOj+B,cAAc,0CAAkC,QACvDi+B,EAAOj+B,cAAc,6BACnB2hC,GACF8B,EAAUhD,mBAAmB,YAAakB,EAAOx8B,WAGnDo+B,EAAmB/P,YAAYiQ,GAE3BD,GACFzjC,SAAS4D,KAAK6vB,YAAY+P,GAG5BxjC,SAAS4D,KAAK4C,UAAUE,IAAI,OAC9B,MACEK,EAAYm3B,EAAQ,WACpBqB,EAAKhM,aAAa,UAAW,GAGnC,CAWA,4BAAA0P,CAA6Bl/B,G,MAC3B,MAAM3D,EAAuB2D,aAAC,EAADA,EAAGC,OAC1B2J,EAAoBvN,EAAQ2e,QAAQla,MACpC+Z,EAAwBxe,EAAQ2e,QAAQka,cACxC0I,EAAmBvhC,EAAQ2e,QAAQ+Z,SACnCoF,EAAwE,QAAlD,EAAA99B,EAAQge,QAAQ,0CAAkC,QAAIhe,EAAQge,QAAQ,8BAC5FsjB,EAAsCxD,aAAM,EAANA,EAAQh+B,iBAAiB,oCAC/DshC,EAA+BtD,EAAS/9B,EAAW+9B,EAAQ,uCAAyC,KACpGsE,EAAqCtE,EAAS/9B,EAAW+9B,EAAQ,eAAiB,KAClFgE,EAA8BhE,EAASA,EAAOj+B,cAAc,sCAAwC,KACpGsjC,EAAqBrF,EAAO7oB,aAAa,wBACzCysB,EAAiC5D,aAAM,EAANA,EAAQh+B,iBAAiB,yBAEhE,GAASwuB,SAAS6S,sBAAsBnhC,GACxCA,EAAQmzB,aAAa,WAAY,YACjC,GAAS7E,SAAS+S,qBAAqBC,EAAY/zB,EAAWiR,EAAe+iB,GAC7E,GAASjT,SAASmT,qBAAqBC,EAAOljB,GAEzC4jB,GAAuB,GAAS9T,SAASsT,WAAWR,EAAiBphC,EAASmjC,EAAWrB,GAC1FM,GAAuB,GAAS9T,SAAS6T,4BAA4BrE,EAAQsE,GAE5E,OAAce,GAAW,GAAS7U,SAASwU,sBAClD,CAEA,oBAAAA,CAAqBn/B,GACnB,MAAM6/B,EAA+B,EAAQ,2CAE7C,IAAKA,EAAiB,OAAO,EAE7B,MAAM5/B,EAASD,aAAC,EAADA,EAAGC,OAElB,GAAIA,GAAUA,EAAOqR,aAAa,WAAY,OAE9C,MAAMwuB,EAAgCD,aAAe,EAAfA,EAAiBvuB,aAAa,wBAC9DmsB,EAA+BoC,aAAe,EAAfA,EAAiB3jC,cAAc,uCAC9D4iC,EAAsB,EAAQ,wDAC9BtD,EAAoBqE,EAAgB3jC,cAAc,sBAClD2hC,EAAsBrC,EAAKt/B,cAAc,oCAE/C,GAAKs/B,EAAL,CAEA,GAAIsE,GAAwBrC,EAI1B,OAHAjC,EAAKvgB,gBAAgB,WACrB4kB,EAAgBp9B,UAAUC,OAAO,gBACjC+6B,EAAgBziB,QAAQtd,MAAQ,aAIlC89B,EAAKhM,aAAa,aAAc,IAChCwB,GAAewK,GAAM,KACnBA,EAAKvgB,gBAAgB,cACrBugB,EAAKvgB,gBAAgB,WACjB,OACFhf,SAAS4D,KAAK4C,UAAUC,OAAO,QAC/Bm7B,SAAAA,EAAQn7B,UAEVM,EAAY68B,EAAiB,WACzBf,GAAU,MAAYh5B,KAAKi5B,aAAaD,EAAO,GAlBpC,CAoBnB,GApMmB3B,GAAQ,OAD5Bx5B,GACoBw5B,I,8UCAN,IAAM4C,GAAM,GAAZ,MAIb,WAAAxsB,GAFA,KAAAjF,MAAgB,SAGd,GAAOqc,SAAW7kB,KAElB/G,EAAY,CACVC,KAAM,QACNE,OAAQ,CACN,CACE/B,SAAW6C,IACT,GAAO2qB,SAASqV,WAAWhgC,aAAC,EAADA,EAAGC,OAAO,GAGzC,CACEvC,MAAOoI,KAAKwI,MACZnR,SAAU2I,KAAKksB,iBAEjB,CACEt0B,MAAO,cACPP,SAAU2I,KAAKm6B,gBAIvB,CAEA,eAAAjO,CAAgBhyB,EAAU2B,EAAiBQ,G,MACrCnC,KACEA,aAAC,EAADA,EAAG4a,iBAAgB5a,EAAE4a,iBACrB5a,EAAEC,SAAQ0B,EAAK3B,EAAEC,SAGvB,IAAIA,EAAS0B,EAAGqZ,QAAQ/a,aAAUxD,EAOlC,GALKwD,IAEHA,GADA0B,EAAKA,EAAGZ,YACIia,QAAQ/a,aAAUxD,IAG3BwD,EAAQ,OAAO,EACpB,MAAMigC,EAAajgC,EAAOpD,MAAM,KAE1BsjC,EAAgC,GAOtC,GALAD,EAAWjhC,SAASgB,IAClB,MAAMmgC,EAAO99B,MAAM4jB,KAAKjqB,SAASE,iBAA8B,oBAAoB8D,QACnFkgC,EAAevhC,QAAQwhC,EAAK,KAGzBD,EAAgB,OAAO,EAC5B,MAAM/P,EAAwD,QAAlC,EAAAzuB,EAAGd,WAAW,4BAAoB,eAAEC,MAmChE,OAjCAq/B,EAAelhC,SAASE,I,MAoBtB,GAnBKA,EAAKmS,aAAa,gBAAmBnP,GAIxChD,EAAKqwB,aAAa,iBAAkB,IAEpCwB,GAAe7xB,GAAM,KACnBA,EAAK8b,gBAAgB,kBACrB9b,EAAK8b,gBAAgB,eACrBhf,SAAS4D,KAAK4C,UAAUC,OAAO,OAAO,MARxCvD,EAAKqwB,aAAa,cAAe,IACjCvzB,SAAS4D,KAAK4C,UAAUE,IAAI,SAiB1BytB,EAAa,CACf,MAAMiQ,EAAgClhC,EAAKjD,cAAc,uBACrDmkC,IACFA,EAAYv/B,MAAQsvB,GAGtB,MAAMI,EAAoBrxB,EAAKjD,cAAc,0CACzCs0B,GACFA,EAAKhB,aAAa,cAAe,GAAiC,QAA9B,EAAAgB,EAAK3vB,WAAW,sBAAc,eAAEC,SAASsvB,IAEjF,MAGK,CACT,CAEA,UAAA4P,CAAW//B,GACT,MAAMqgC,EAA0C,EAAS,gBAAgB,GAAO3V,SAASrc,WACnFiyB,EAA0C,IAAI7sB,IAEpD4sB,EAAerhC,SAAS0C,I,MACtB,MAAMf,EAAyC,QAA5B,EAAAe,EAAGd,WAAW,sBAAc,eAAEC,MAEE7E,SAASE,iBAAsB,oBAAoByE,OACpF3B,SAASE,IACrBlD,SAASowB,SAASpsB,KAAY0B,EAAG0qB,SAASpsB,IAAW2C,EAAQzD,IAASyD,EAAQjB,KAAQxC,EAAKktB,SAASpsB,IAAW0B,IAAO1B,GACpHd,EAAKmS,aAAa,gBAAgBivB,EAAc76B,IAAIvG,EAAK6b,QAAQmV,UAAWxuB,EAClF,GACA,IAGJ4+B,EAActhC,SAASE,GAAS2G,KAAKksB,gBAAgB,KAAM7yB,GAAM,IACnE,CAEA,YAAA8gC,CAAajgC,GACX,MAAM2B,EAAK3B,EAAEC,OAEb,GADmB0B,EAAGqZ,QAAQwlB,aACX,KAAY,OAC/B,MAAMC,EAAS9+B,aAAE,EAAFA,EAAI0Y,QAAQ,MACvBomB,IACFA,EAAOnvB,aAAa,aAAemvB,EAAOxlB,gBAAgB,aAAewlB,EAAOjR,aAAa,YAAa,IAE9G,GAnHmBuQ,GAAM,OAD1Bp8B,GACoBo8B,I,8UCCN,IAAMpQ,GAAI,GAAV,MAGb,WAAApc,GAiFQ,KAAAmtB,aAAe,KACrB,MAAM3X,EAAM,IAAI4X,IAAIpkC,OAAOka,SAAS8D,MAC9BqmB,EAAS,IAAIC,gBAAgB9X,EAAI+X,QACvC,OAAOF,aAAM,EAANA,EAAQn7B,IAAI,YAAY,EAGjC,KAAAs7B,iBAAoB/gC,IAClB,MACMghC,EADKhhC,EAAEC,OACIoa,QAAQ,eACnB4mB,EAAWD,aAAK,EAALA,EAAO9kC,cAAc,SAChCglC,EAAWF,aAAK,EAALA,EAAO9kC,cAAc,KACjC+kC,IACgB,YAAjBA,EAASjiC,MACXiiC,EAASjiC,KAAO,OAChBkiC,SAAAA,EAAUz+B,UAAUC,OAAO,kBAC3Bw+B,SAAAA,EAAUz+B,UAAUE,IAAI,qBAExBs+B,EAASjiC,KAAO,WAChBkiC,SAAAA,EAAUz+B,UAAUC,OAAO,mBAC3Bw+B,SAAAA,EAAUz+B,UAAUE,IAAI,mBAC1B,EAGF,KAAAw+B,gBAAmBnhC,IACjB,MAAMohC,EAAUphC,aAAC,EAADA,EAAGC,OACba,EAAQsgC,EAAQtgC,MAEtBgF,KAAKu7B,kBAAkB,SAAUvgC,EAAM1C,QAAU,GACjD0H,KAAKu7B,kBAAkB,YAAa,QAAQC,KAAKxgC,IACjDgF,KAAKu7B,kBAAkB,YAAa,QAAQC,KAAKxgC,IACjDgF,KAAKu7B,kBAAkB,SAAU,KAAKC,KAAKxgC,IAC3CgF,KAAKu7B,kBAAkB,aAAc,oBAAoBC,KAAKxgC,IAE9DgF,KAAKy7B,qBAAqBH,EAAQ/mB,QAAQ,QAA2B,EAGvE,KAAAmnB,uBAA0BxhC,IACxB,MAAMyhC,EAAkBzhC,aAAC,EAADA,EAAGC,OACrBuwB,EAAOiR,EAAgBpnB,QAAQ,QAC/BqnB,EAAWlR,EAAKt0B,cAAc,6BAEpC,OAAIulC,GAAmBC,GACrB57B,KAAKu7B,kBAAkB,QAASI,EAAgB3gC,OAAS4gC,EAAS5gC,OAClEgF,KAAKy7B,qBAAqB/Q,IACnB,IAET1qB,KAAKy7B,qBAAqB/Q,IACnB,EAAK,EAGd,KAAAmR,eAAkBC,IAChB,IAAK,MAAO/7B,EAAK/E,KAAUyE,OAAOgT,QAAQqpB,GAAc,CACtD,MAAMzR,EAAYl0B,SAASC,cAAc,oBAAoB2J,OACzDsqB,GAAWsB,GAAetB,EAAWrvB,EAAiB,UAAU,EACtE,GAGF,KAAA+gC,mBAAsBxlC,I,MACc,QAAlC,EAAAA,EAAQF,iBAAiB,iBAAS,SAAE8C,SAAS0C,IAC3CS,EAAUT,EAAI,SACVA,EAAGzF,cAAc,qCAAoCyF,EAAGzF,cAAc,mCAAmCsF,UAAY,GAAE,GAC3H,EAGJ,KAAAsgC,iBAAmB,CAACzlC,EAAsB0lC,KACxCA,SAAAA,EAAe9iC,SAASiF,I,MACtB,MAAM89B,EAAkC,QAAnB,EAAA99B,aAAK,EAALA,EAAO89B,oBAAY,eAAE/kC,cACpCglC,EAAiB5lC,EAAQH,cAAc,yBAAyB8lC,OAChE/R,EAAmBgS,EAAe/lC,cAAc,mCAChDgmC,EAAeh+B,aAAK,EAALA,EAAOg+B,aACxBjS,GAAoBiS,IACtBjS,EAAiBzuB,UAAY0gC,EAC7B,EAAOD,EAAgB,SACzB,GACA,EAGJ,KAAAE,qBAAuB,CAAC9lC,EAAsBuT,KAC5C,MAAMwyB,EAA6B/lC,EAAQH,cAAc,wCACrDkmC,IAA4BA,EAA2B5gC,UAAYoO,EAAO,EAGhF,KAAA2xB,qBAAwB/Q,IACtB,IAAKA,EAAM,OAAO,EAElB,MAAM6R,EAAmB7R,EAAKt0B,cAAc,+BACtCwlC,EAAWlR,EAAKt0B,cAAc,6BAC9BulC,EAAkBjR,EAAKt0B,cAAc,iCACrCw0B,EAASF,EAAKt0B,cAAc,yBAC5BomC,EAAyF,KAA3ED,aAAgB,EAAhBA,EAAkBlmC,iBAAiB,6BAA6BiC,QAEpF,OAAIsjC,EAAS5gC,OAAS2gC,EAAgB3gC,OAASwhC,GAC7C5R,EAAOzV,gBAAgB,aAChB,IAGTyV,EAAOlB,aAAa,WAAY,aACzB,EAAK,EAGd,KAAA6R,kBAAoB,CAACz8B,EAAY29B,KAC/B,MAAMC,EAAcvmC,SAASwmC,eAAe79B,GACxC49B,IACED,EACFC,EAAY//B,UAAUE,IAAI,UAE1B6/B,EAAY//B,UAAUC,OAAO,UAEjC,EA5LA,GAAKioB,SAAW7kB,KAChB/G,EAAY,CACVC,KAAM,SACNE,OAAQ,CACN,CACEG,OAAQ,kBACRlC,SAAU2I,KAAK48B,oBAIrB3jC,EAAY,CACVC,KAAM,QACNE,OAAQ,CACN,CACExB,MAAO,kBACPP,SAAU2I,KAAKi7B,qBAIrBhiC,EAAY,CACVC,KAAM,QACNE,OAAQ,CACN,CACExB,MAAO,iBACPP,SAAU2I,KAAKq7B,iBAEjB,CACEzjC,MAAO,mBACPP,SAAU2I,KAAK07B,0BAIvB,CAEA,eAAAkB,CAAgB1iC,G,cACdA,EAAE4a,iBACF5a,EAAE2a,kBAEF,MAAMte,EAA2B2D,EAAEC,OAC7BkF,EAAiB,IAAI2qB,SAASzzB,GAC9BsmC,EAAuBtmC,EAAQge,QAAQ,gBACvCqP,EACJiZ,IAA0B,QAAf,EAAAA,EAAQ3nB,eAAO,eAAE0O,OACT,QAAf,EAAAiZ,EAAQ3nB,eAAO,eAAE0O,MACyE,QAAzF,EAAkF,QAAnF,EAACztB,SAASC,cAAc,8CAA2D,eAAE4E,aAAK,QAAI,GAiCpG,MCtFoB,EAACioB,EAAa5jB,EAAWukB,IACxC,GAAYD,KAAKV,EAAK5jB,EAAMukB,GDsDjCgF,CAAqC,QAA5B,EAAAryB,EAAQwE,WAAmB,cAAC,eAAEC,MAAOqE,EAAMukB,GAAOxV,MAAMkB,I,QAC/D,GAAIA,EAASjQ,KAAKuoB,QAAS,CACzB,GAAI,GAAK/C,SAAS+V,eAAgB,OAAQnkC,OAAOka,SAAS8D,KAAO,GAAKoQ,SAAS+V,eAE/E,GAAItrB,EAASjQ,KAAKy9B,SAChB,IAAK,MAAO/8B,EAAK/E,KAAUyE,OAAOgT,QAAQnD,EAASjQ,KAAKy9B,UAAW,CACjE,MAAMzS,EAAYl0B,SAASC,cAAc,oBAAoB2J,OACzDsqB,GAAWsB,GAAetB,EAAWrvB,EAAiB,mBAC5D,MACSsU,EAASjQ,KAAKorB,OACvB5xB,YAAW,WACT8X,SAAS8Z,QACX,GAAG,KACMnb,EAASjQ,KAAK09B,WACvBxmC,EAAQymC,QACJ1tB,EAASjQ,KAAKwoB,SAChB,GAAKhD,SAASgX,eAAevsB,EAASjQ,KAAKwoB,UAGzCvY,EAASjQ,KAAKwoB,SAChB,GAAKhD,SAASgX,eAAevsB,EAASjQ,KAAKwoB,QAGjD,KAAO,CACL,MAAMoU,EAA8B,QAAd,EAAA3sB,aAAQ,EAARA,EAAUjQ,YAAI,eAAE48B,cAClC1lC,GAAW+Y,EAASjQ,KAAK49B,qBAAqB,GAAKpY,SAASwX,qBAAqB9lC,EAA0C,QAAjC,EAAA+Y,EAASjQ,KAAK49B,2BAAmB,eAAEjiC,OAC7HzE,GAAS,GAAKsuB,SAASkX,mBAAmBxlC,GAC1C0lC,GAAe,GAAKpX,SAASmX,iBAAiBzlC,EAAS0lC,EAC7D,MAGK,CACT,GAlFmBpS,GAAI,OADxBhsB,GACoBgsB,I,2SEJd,MAAMqT,GAAS,IAAY,qCnCoMb,IAACC,QmCnMd,GAAYx9B,IAAI,qBnCmMFw9B,EmClMR,InCkMuB,IAAIz/B,SAASC,GAAY9E,WAAW8E,EAASw/B,KmCjMlF,I,8UCDe,IAAM,GAAI,GAAV,MAGb,WAAA1vB,GACE,GAAKoX,SAAW7kB,KAChB/G,EAAY,CACVC,KAAM,QACNE,OAAQ,CACN,CACEG,OAAQ,UACRlC,SAAU2I,KAAKo9B,YAIvB,CAEA,QAAAA,CAASljC,GACPA,EAAE4a,iBACF5a,EAAE2a,kBAEFqoB,KACG9uB,MAAK,IAAO3X,OAAOka,SAAS8D,KAAO,MACnCwb,OAAO1xB,GAAQskB,QAAQwa,IAAI9+B,IAChC,GAvBmB,GAAI,OADxBV,GACoB,I,slBCFN,MAAMy/B,GAEnB,WAAA7vB,GAeA,KAAA8vB,YAAc,K,UACZ,IAAKv9B,KAAKw9B,uBAAwB,QAIU,QAF7B,EACA,QADA,EAAe,QAAf,EAAArnC,SAASW,cAAM,eAC1BC,MAAM,aAAK,eACXC,MAAMukB,GAAQA,EAAIrkB,WAAW,oBAAW,eACxCH,MAAM,KAAK,KAEFumC,GAAQzY,SAAS4Y,aAAa,EAG7C,KAAAA,YAAc,IAAY,mC,MACxB,MAAMnuB,QC9B0C,qCAClD,aAAa,GAAY3P,IAAI,eAC/B,KD6BqB,QAAb,EAAA2P,EAASjQ,YAAI,eAAEu3B,cAAazgC,SAAS4D,KAAK88B,mBAAmB,YAAavnB,EAASjQ,KAAKu3B,YAC9F,IAEA,KAAA8G,cAAgB,KACdvnC,SAASW,OAAS,eAClB,MAAM6mC,EAAuBxnC,SAASC,cAAc,8BAChDunC,GAASA,EAAQ/gC,QAAQ,EAG/B,KAAA4gC,qBAAuB,IACdrnC,SAASgtB,gBAAgB3X,aAAa,WArC7C8xB,GAAQzY,SAAW7kB,KACnB/G,EAAY,CACVC,KAAM,QACNE,OAAQ,CACN,CACExB,MAAO,kBACPP,SAAU2I,KAAK09B,kBAKrB19B,KAAKu9B,aACP,E,snBEZK,IAAMK,GAAN,MACL,WAAAnwB,GA+BA,KAAAowB,cAAiB3jC,IACf,MACM4jC,EADmB5jC,EAAEC,OACe+a,QAAkB,SAE5D,QAAK4oB,IAEL99B,KAAK+9B,kBAAkBD,IAChB,EAAK,EAGN,KAAAC,kBAAqBD,IC9CC,IAAOnO,KD+ClBmO,EC/CqD,qCACxE,aAAa,GAAYn+B,IAAI,+CAA+CgwB,IAC9E,KD8COvhB,MAAMkB,GAAatP,KAAKg+B,oCAAoC1uB,KAC5D2gB,OAAO7xB,IACY,GAClB,EAGE,KAAA4/B,oCAAuC1uB,I,cAC7C,GAAsB,OAAlBA,aAAQ,EAARA,EAAUjQ,SAA+B,QAAd,EAAAiQ,aAAQ,EAARA,EAAUjQ,YAAI,eAAEuoB,SAI7C,OAHkB,QAAd,EAAAtY,aAAQ,EAARA,EAAUjQ,YAAI,eAAE+8B,eAClBnQ,GAASI,eAAeD,GAAiBhuB,MAAOkR,EAASjQ,KAAK+8B,eAEzD,EAGT,MAAM6B,EAAkB,EAAQ,8BAC1BC,EAAwB,EAAQ,uCAChCC,EAAkC,QAAd,EAAA7uB,aAAQ,EAARA,EAAUjQ,YAAI,eAAE++B,yBACpCC,EAAwC,QAAd,EAAA/uB,aAAQ,EAARA,EAAUjQ,YAAI,eAAEi/B,+BAEhD,GAAuB,MAAnBL,GAAgD,MAArBE,EAA2B,CAGxD,GAFAF,EAAgBviC,UAAYyiC,EAEC,MAAzBD,GAA4D,MAA3BG,EAAiC,CACpEH,EAAsBxiC,UAAY2iC,EAClC,MAAME,EAAoB,IAAI/1B,MAAM,8BAA+B,CAAEwpB,SAAS,EAAMC,YAAY,IAChG97B,SAAS4B,cAAcwmC,EACzB,CAEApoC,SAAS4D,KAAK4C,UAAUC,OAAO,OACjC,EAEiB,QAAb,EAAA0S,EAASjQ,YAAI,eAAE0vB,mBACjBt4B,OAAOka,SAAS6tB,KAAOlvB,EAASjQ,KAAK0vB,gBACvC,EAGM,KAAA0P,gBAAmBvkC,IACzB8F,KAAK0+B,uBAAuBxkC,EAAG,CAAC,WAAY,oBACrC,GAGD,KAAAykC,gBAAmBzkC,IACzB8F,KAAK0+B,uBAAuBxkC,EAAG,CAAC,mBACzB,GAwCD,KAAA0kC,kBAAoB,CAAC7G,EAA2B8G,KACtD,MAAMhjC,EAAK1F,SAASC,cAAc,8BAElC,GAAIyF,GAAMk8B,EAAQ,CAChB,MAAM+G,EAAmBjjC,EAAGqZ,QAAQ6pB,eACpChH,EAAOiH,SAAWF,IAAqBD,CACzC,GAGM,KAAAI,gBAAmB/kC,I,UACzB,MAAM2B,EAAK3B,EAAEC,OACP+kC,EAAoC,QAAX,EAAArjC,aAAE,EAAFA,EAAIqZ,eAAO,eAAE6pB,eACtCjB,EAA8B,QAAX,EAAAjiC,aAAE,EAAFA,EAAIqZ,eAAO,eAAE4Z,SAEhCqQ,EAAkBtjC,aAAE,EAAFA,EAAI0Y,QAAQ,yCAC9B6qB,EAAgBD,aAAe,EAAfA,EAAiB5qB,QAAQ,8BAEzC8qB,EAA+E,QAA9D,EAAAF,aAAe,EAAfA,EAAiB/oC,cAAc,uCAA+B,eAAEA,cAAc,iBAC/FkpC,EAA6BD,aAAc,EAAdA,EAAgBnP,UAE7CqP,EAAeH,aAAa,EAAbA,EAAehpC,cAAc,+BAC5CopC,EAAoBJ,aAAa,EAAbA,EAAehpC,cAAc,gCASvD,GAPI8oC,IACFK,SAAAA,EAAc7V,aAAa,sBAAuBwV,IAEhDpB,IACFyB,SAAAA,EAAc7V,aAAa,gBAAiBoU,GAC5C0B,SAAAA,EAAmB9V,aAAa,gBAAiBoU,IAE/CwB,EAA4B,EACjBE,aAAiB,EAAjBA,EAAmBppC,cAAc,iBACzC85B,UAAYoP,CACnB,CACA,MAAM3N,EAAiB,EAAQ,sCAC/BA,SAAAA,EAAgB7Q,OAAO,EAhKvB7nB,EAAY,CACVC,KAAM,QACNE,OAAQ,CACN,CACEG,OAAQ,iBACRlC,SAAU2I,KAAK69B,cAAcz2B,KAAKpH,OAEpC,CACEzG,OAAQ,2BACRlC,SAAU2I,KAAKy+B,gBAAgBr3B,KAAKpH,OAEtC,CACEpI,MAAO,8BACPP,SAAU2I,KAAK2+B,gBAAgBv3B,KAAKpH,OAEtC,CACEzG,OAAQ,mBACRlC,SAAU2I,KAAKi/B,gBAAgB73B,KAAKpH,SAI5C,CAEA,MAAA9B,GAIE,OAHIzH,OAAOka,SAAS6tB,MAClBx+B,KAAK+9B,kBAAkBtnC,OAAOka,SAAS6tB,KAAKv7B,QAAQ,IAAK,MAEpD,CACT,CA4DQ,sBAAAy7B,CAAuBxkC,EAAUulC,GACvC,MAAMC,EAAWxlC,EAAEC,OACbwlC,EAAWD,aAAQ,EAARA,EAAUnrB,QAAQ,4CAEnC,QAAKvU,KAAK4/B,mBAAmBF,EAAUC,KAEvC3/B,KAAK6/B,kBAAkBH,EAAUC,EAAUF,IAEpC,EACT,CAEQ,kBAAAG,CAAmB/jC,EAAiB8jC,GAC1C,GAAI9jC,aAAE,EAAFA,EAAI2P,aAAa,YAAa,OAAO,EAEzC,MAAMs0B,EAAWH,aAAQ,EAARA,EAAUvpC,cAAc,cAGzC,OAFA0pC,SAAAA,EAAU3qB,gBAAgB,YAC1BtZ,EAAG6tB,aAAa,WAAY,aACrB,CACT,CAEQ,iBAAAmW,CAAkBhkC,EAAiB8jC,EAAuBF,G,MAChE,MAAMM,EAAWJ,EAASprB,QAAQ,qBAC5BwjB,EAASgI,aAAQ,EAARA,EAAU3pC,cAAc,mCACjCmpC,EAAeQ,aAAQ,EAARA,EAAU3pC,cAAc,+BAEvCyoC,EAAiC,QAAX,EAAAhjC,aAAE,EAAFA,EAAIqZ,eAAO,eAAE6pB,eACrChH,GAAQ/3B,KAAK4+B,kBAAkB7G,EAAQ8G,GAE3CY,EAAStmC,SAAS6mC,IAChB,MAAMC,EAA0BpkC,aAAE,EAAFA,EAAIqZ,QAAQ8qB,GACxCC,IACEV,EAAcA,SAAAA,EAAc7V,aAAa,QAAUsW,EAASC,GACvDlI,IAAQA,SAAAA,EAAQrO,aAAa,QAAUsW,EAASC,IAC3D,GAEJ,GA7HWrC,GAAc,IAD1B//B,GACY+/B,IEHE,MAAMsC,GAGnB,WAAAzyB,GAaA,KAAA0yB,uBAA0BjmC,I,QACxBA,EAAE4a,iBACF5a,EAAE2a,kBAEF,MAAMwkB,EAAuB,IAAIxhC,YAAY,0BAC7C1B,SAAS4B,cAAcshC,GAEvB,MAAMtB,EAAsB79B,EAAEC,OACxB2J,EAAYi0B,EAAO7kB,aAAa,kBAEhCmhB,EAAuE,QAAjD,EAAA0D,EAAOxjB,QAAQ,0CAAkC,QAAIwjB,EAAOxjB,QAAQ,8BAC1FojB,EAA+BtD,EAAS/9B,EAAW+9B,EAAQ,uCAAyC,KACpG+L,EAAYzI,aAAe,EAAfA,EAAiBzkB,aAAa,cAC1CmtB,EAAyF,QAAhF,IAAQ,0DAA0Dv8B,cAAc,SAqB/F,OAnBIi0B,GAAUj0B,IACPu8B,EAcHA,EAAO3W,aAAa,cAAe,IDvCY,EAAO5lB,EAAmBs8B,IAAoC,qCACnH,aAAa,GAAYzgC,IAAI,sEAAsEmE,eAAuBs8B,IAC5H,ICwBQE,CAAwCx8B,EAAWs8B,GAChDhyB,MAAMmyB,I,UACL,IAAa,QAAT,EAAAA,aAAG,EAAHA,EAAKlhC,YAAI,eAAEuoB,UAAqC,OAAjB,QAAT,EAAA2Y,aAAG,EAAHA,EAAKlhC,YAAI,eAAEu3B,aAAqB,CACxD,MAAMpN,EAAUrzB,SAAS01B,cAAcC,yBAAkC,QAAT,EAAAyU,aAAG,EAAHA,EAAKlhC,YAAI,eAAEu3B,aAAa7K,kBACxF51B,SAASC,cAAc,QAAQwzB,YAAYJ,GAC3CrzB,SAAS4D,KAAK4C,UAAUE,IAAI,QAC5B2sB,EAAQE,aAAa,cAAe,GACtC,KAEDuG,OAAO1xB,IACU,MAOjB,CAAK,EA9CZ2hC,GAAmBrb,SAAW7kB,KAC9B/G,EAAY,CACVC,KAAM,QACNE,OAAQ,CACN,CACEG,OAAQ,YACRlC,SAAU2I,KAAKmgC,0BAIvB,E,g6BCVa,IAAMK,GAAY,GAAlB,oBACL,KAAAC,aAAmCtqC,SAASC,cAAc,oCAmBlE,KAAAsqC,gBAAkB,IAAY,mCAC5B,MAAMrhC,EAA6B,CACjCshC,QAAS3gC,KAAKygC,aAAavrB,QAAQyrB,QACnC7+B,KAAM9B,KAAKygC,aAAavrB,QAAQpT,WCvBF,CAAOzC,GAA6C,qCACtF,aAAa,GAAYM,IAAI,6BAA6BN,EAAKshC,gBAAgBthC,EAAKyC,OACtF,IDwBU8+B,CAAqBvhC,GACxB+O,MAAMkB,IACDA,EAASjQ,KAAKuoB,SAAoD,KAAzCtY,EAASjQ,KAAKwhC,yBACzC,EAAO7gC,KAAKygC,aAAc,gBAC1BzgC,KAAKygC,aAAa/kC,UAAY4T,EAASjQ,KAAKwhC,uBAC9C,IAED5Q,OAAO7xB,IACNykB,QAAQzkB,MAAM,qCAAsC,CAClD7E,OAAQ,uBACR6E,MAAOA,EAAM0L,QACbzK,QACA,GAER,IAEA,KAAAyhC,kBAAoB,KAClB9gC,KAAKygC,aAAa7jC,SAClBoD,KAAKmrB,WAAW,EAOlB,KAAAA,UAAY,KACV,MAAM4V,EAAO,IAAIj2B,KACjBi2B,EAAKC,YAAYD,EAAKE,cAAgB,GAEtC9V,GAAU,OAAQ,GAAa+V,gBAAiBH,EAAK,EAGvD,KAAAI,wBAA0B,K,UAMxB,YAAkBxqC,KAHmD,QAFtD,EACA,QADA,EAAe,QAAf,EAAAR,SAASW,cAAM,eAC1BC,MAAM,aAAK,eACXC,MAAMukB,GAAQA,EAAIrkB,WAAW,GAAagqC,gBAAkB,cAAK,eACjEnqC,MAAM,KAAK,GAEY,CAE/B,CA9DE,MAAAmH,IACO8B,KAAKmhC,2BAA6BnhC,KAAKygC,cAC1CzgC,KAAK0gC,kBAGPznC,EAAY,CACVC,KAAM,QACNE,OAAQ,CACN,CACExB,MAAO,sBACPP,SAAU2I,KAAK8gC,qBAIvB,CA6BA,oBAAOI,GACL,OAAO,GAAaE,WACtB,GA/Ce,GAAAA,YAAc,wBAFVZ,GAAY,OADhC3iC,GACoB2iC,I,uVEYrB,IAAMa,GAAN,MACE,WAAA5zB,GACE,IAAI,GAAOyW,OAAO,IAAIE,GAAa,EAAG,SAASU,SAC/C,IAAI,EAAOtX,mBACT,IAAII,IAAyB,CAC3B,CAAC5B,EAAaE,IAAK,IAAI0J,IACvB,CAAC5J,EAAaC,MAAO,IAAI0P,IACzB,CAAC3P,EAAaG,QAAS,IAAI4R,OAG/B,IAAIuf,GACJ,IAAI,GACJ,IAAI4C,EAGN,GAfImB,GAAM,IAFXxjC,GAEKwjC,G,GClBFC,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqB7qC,IAAjB8qC,EACH,OAAOA,EAAaC,QAGrB,IAAIC,EAASL,EAAyBE,GAAY,CAGjDE,QAAS,CAAC,GAOX,OAHAE,EAAoBJ,GAAUhpC,KAAKmpC,EAAOD,QAASC,EAAQA,EAAOD,QAASH,GAGpEI,EAAOD,OACf,CAGAH,EAAoBM,EAAID,E/CzBpB3rC,EAAW,GACfsrC,EAAoBO,EAAI,CAACpgC,EAAQqgC,EAAUxpC,EAAIypC,KAC9C,IAAGD,EAAH,CAMA,IAAIE,EAAeC,IACnB,IAAS7pC,EAAI,EAAGA,EAAIpC,EAASqC,OAAQD,IAAK,CAGzC,IAFA,IAAK0pC,EAAUxpC,EAAIypC,GAAY/rC,EAASoC,GACpC8pC,GAAY,EACPC,EAAI,EAAGA,EAAIL,EAASzpC,OAAQ8pC,MACpB,EAAXJ,GAAsBC,GAAgBD,IAAaviC,OAAOkb,KAAK4mB,EAAoBO,GAAGO,OAAOtiC,GAASwhC,EAAoBO,EAAE/hC,GAAKgiC,EAASK,MAC9IL,EAASliC,OAAOuiC,IAAK,IAErBD,GAAY,EACTH,EAAWC,IAAcA,EAAeD,IAG7C,GAAGG,EAAW,CACblsC,EAAS4J,OAAOxH,IAAK,GACrB,IAAIiqC,EAAI/pC,SACE5B,IAAN2rC,IAAiB5gC,EAAS4gC,EAC/B,CACD,CACA,OAAO5gC,CAnBP,CAJCsgC,EAAWA,GAAY,EACvB,IAAI,IAAI3pC,EAAIpC,EAASqC,OAAQD,EAAI,GAAKpC,EAASoC,EAAI,GAAG,GAAK2pC,EAAU3pC,IAAKpC,EAASoC,GAAKpC,EAASoC,EAAI,GACrGpC,EAASoC,GAAK,CAAC0pC,EAAUxpC,EAAIypC,EAqBjB,EgDzBdT,EAAoBgB,EAAKZ,IACxB,IAAIlhC,EAASkhC,GAAUA,EAAOa,WAC7B,IAAOb,EAAiB,QACxB,IAAM,EAEP,OADAJ,EAAoBkB,EAAEhiC,EAAQ,CAAEiiC,EAAGjiC,IAC5BA,CAAM,ECLd8gC,EAAoBkB,EAAI,CAACf,EAASiB,KACjC,IAAI,IAAI5iC,KAAO4iC,EACXpB,EAAoBqB,EAAED,EAAY5iC,KAASwhC,EAAoBqB,EAAElB,EAAS3hC,IAC5EN,OAAOC,eAAegiC,EAAS3hC,EAAK,CAAEE,YAAY,EAAMN,IAAKgjC,EAAW5iC,IAE1E,ECNDwhC,EAAoBqB,EAAI,CAACziC,EAAKC,IAAUX,OAAOxB,UAAUO,eAAehG,KAAK2H,EAAKC,GCClFmhC,EAAoBe,EAAKZ,IACH,oBAAXmB,QAA0BA,OAAOC,aAC1CrjC,OAAOC,eAAegiC,EAASmB,OAAOC,YAAa,CAAE9nC,MAAO,WAE7DyE,OAAOC,eAAegiC,EAAS,aAAc,CAAE1mC,OAAO,GAAO,ECL9DumC,EAAoBa,EAAI,K,MCKxB,IAAIW,EAAkB,CACrB,KAAM,GAaPxB,EAAoBO,EAAEM,EAAKY,GAA0C,IAA7BD,EAAgBC,GAGxD,IAAIC,EAAuB,CAACC,EAA4B7jC,KACvD,IAGImiC,EAAUwB,GAHTjB,EAAUoB,EAAaC,GAAW/jC,EAGhBhH,EAAI,EAC3B,GAAG0pC,EAASsB,MAAMvkC,GAAgC,IAAxBikC,EAAgBjkC,KAAa,CACtD,IAAI0iC,KAAY2B,EACZ5B,EAAoBqB,EAAEO,EAAa3B,KACrCD,EAAoBM,EAAEL,GAAY2B,EAAY3B,IAGhD,GAAG4B,EAAS,IAAI1hC,EAAS0hC,EAAQ7B,EAClC,CAEA,IADG2B,GAA4BA,EAA2B7jC,GACrDhH,EAAI0pC,EAASzpC,OAAQD,IACzB2qC,EAAUjB,EAAS1pC,GAChBkpC,EAAoBqB,EAAEG,EAAiBC,IAAYD,EAAgBC,IACrED,EAAgBC,GAAS,KAE1BD,EAAgBC,GAAW,EAE5B,OAAOzB,EAAoBO,EAAEpgC,EAAO,EAGjC4hC,EAAqBC,KAAsB,gBAAIA,KAAsB,iBAAK,GAC9ED,EAAmBnqC,QAAQ8pC,EAAqB77B,KAAK,KAAM,IAC3Dk8B,EAAmBxqC,KAAOmqC,EAAqB77B,KAAK,KAAMk8B,EAAmBxqC,KAAKsO,KAAKk8B,G,KC7CvF,IAAIE,EAAsBjC,EAAoBO,OAAEnrC,EAAW,CAAC,OAAO,IAAO4qC,EAAoB,QAC9FiC,EAAsBjC,EAAoBO,EAAE0B,E","sources":["webpack://hayppgroup.commerce.web/webpack/runtime/chunk loaded","webpack://hayppgroup.commerce.web/./ClientApp/shared/scripts/easyfy.core.ts","webpack://hayppgroup.commerce.web/./ClientApp/shared/scripts/easyfy.utils.ts","webpack://hayppgroup.commerce.web/./ClientApp/shared/scripts/easyfy.decorators.ts","webpack://hayppgroup.commerce.web/./ClientApp/shared/scripts/easyfy.events/easyfy.eventdata.ts","webpack://hayppgroup.commerce.web/./ClientApp/shared/scripts/easyfy.events/exporters/eventExporter.stats.ts","webpack://hayppgroup.commerce.web/./ClientApp/shared/scripts/easyfy.events/easyfy.event.devlogger.ts","webpack://hayppgroup.commerce.web/./ClientApp/shared/scripts/easyfy.events/exporters/eventExporter.ga4.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/services/features.service.ts","webpack://hayppgroup.commerce.web/./ClientApp/shared/scripts/easyfy.events/exporters/eventExporter.klaviyo.ts","webpack://hayppgroup.commerce.web/./ClientApp/shared/scripts/easyfy.events/easyfy.eventhandler.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/modules/eventMappers/dataMapper.ga4.ts","webpack://hayppgroup.commerce.web/./ClientApp/shared/scripts/easyfy.events/mappers/dataMapper.stats.ts","webpack://hayppgroup.commerce.web/./ClientApp/shared/scripts/easyfy.events/mappers/dataMapper.klaviyo.ts","webpack://hayppgroup.commerce.web/./ClientApp/shared/scripts/easyfy.datalayer.ts","webpack://hayppgroup.commerce.web/./ClientApp/shared/scripts/easyfy.axios.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/services/search.service.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/modules/search.ts","webpack://hayppgroup.commerce.web/./ClientApp/inline/scripts/services/form.service.ts","webpack://hayppgroup.commerce.web/./ClientApp/shared/scripts/easyfy.toaster.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/modules/form.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/services/basket.service.ts","webpack://hayppgroup.commerce.web/./ClientApp/shared/scripts/easyfy.enums.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/shared/utils.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/modules/snackbar.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/shared/priceHelper.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/modules/basket.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/services/header.service.ts","webpack://hayppgroup.commerce.web/../Easyfy.Commerce/Easyfy.Commerce.Presentation/ClientApp/shared/scripts/easyfy.core.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/modules/breadcrumb.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/modules/menu.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/modules/countryselector.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/modules/header.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/modules/dropdown.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/shared/toggle.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/shared/form.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/services/form.service.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/services/logout.service.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/shared/logout.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/modules/agegate.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/services/agegate.service.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/modules/optionselector.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/services/productoptions.service.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/shared/subscriptionHelper.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/modules/countrypopup.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/services/countrypopup.service.ts","webpack://hayppgroup.commerce.web/./ClientApp/web/scripts/pages/global.ts","webpack://hayppgroup.commerce.web/webpack/bootstrap","webpack://hayppgroup.commerce.web/webpack/runtime/compat get default export","webpack://hayppgroup.commerce.web/webpack/runtime/define property getters","webpack://hayppgroup.commerce.web/webpack/runtime/hasOwnProperty shorthand","webpack://hayppgroup.commerce.web/webpack/runtime/make namespace object","webpack://hayppgroup.commerce.web/webpack/runtime/runtimeId","webpack://hayppgroup.commerce.web/webpack/runtime/jsonp chunk loading","webpack://hayppgroup.commerce.web/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// exemple\n// element('.about'); //
\n// element('[data-action=\"top-nav\"]'); //
\n//export const element = (query: string) => document.querySelector(query);\nexport const element = (query: string) => document.querySelector(query);\n\nexport const elements = (query: string) => document.querySelectorAll(query);\n\nexport const elementsOf = (element: Element | HTMLElement, query: string) => element.querySelector(query);\n\n// exemple\n// elementContains(document.querySelector('head'), document.querySelector('title')); // true\n// elementContains(document.querySelector('body'), document.querySelector('body')); // false\nexport const elementContains = (parent: Element, child: Element) => parent !== child && parent.contains(child);\n\nexport const on = (action: string | Element, type: string, callback: Function, ref?: object, meta?: object) => {\n docReady(() => {\n type.split(' ').forEach(function (t) {\n (action instanceof Element ? action : element(action)).addEventListener(\n t,\n (e) => {\n try {\n callback.call(e.target, e, ref ?? null, meta ?? null);\n } catch (err) { }\n },\n { once: false, passive: true }\n );\n });\n });\n};\n\nexport const one = (action: string | Element, type: string, callback: Function) => {\n docReady(() => {\n type.split(' ').forEach(function (e) {\n (action instanceof Element ? action : element(action)).addEventListener(e, callback, { once: true });\n });\n });\n};\n\nexport const event = (action: string, type: string, callback: EventListener | EventListenerObject) => {\n docReady(() => {\n element(`[data-event=\"${action}\"]`)?.addEventListener(type, callback, false);\n });\n};\n\nexport const events = (action: string, type: string, callback: EventListener | EventListenerObject) => {\n docReady(() => {\n elements(`[data-event=\"${action}\"]`)?.forEach((item) => {\n item.addEventListener(type, callback, false);\n });\n });\n};\n\nexport const action = (action: string, type: string, callback: EventListener | EventListenerObject) => {\n docReady(() => {\n element(`[data-action=\"${action}\"]`)?.addEventListener(type, callback, false);\n });\n};\n\nexport const actions = (action: string, type: string, callback: EventListener | EventListenerObject | Function) => {\n docReady(() => {\n elements(`[data-action=\"${action}\"]`)?.forEach((el) => el?.addEventListener(type, callback, false));\n });\n};\n\nexport const bind = (action: string, type: string, callback: EventListener | EventListenerObject) => {\n docReady(() => {\n elements(action || '')?.forEach((item) => {\n type.split(' ').forEach(t => {\n item.addEventListener(t, callback, false);\n });\n });\n });\n};\n\nexport const off = (action: string | Element | HTMLElement | Array, type: string, callback: EventListener | EventListenerObject) => {\n if (action instanceof String || action instanceof Element || action instanceof HTMLElement) {\n (action instanceof Element || action instanceof HTMLElement ? action : element(action)).removeEventListener(type, callback, false);\n }\n\n if (action instanceof Array) {\n for (let x of action) {\n let item: any = x;\n (item instanceof Element || item instanceof HTMLElement ? item : element(item)).removeEventListener(type, callback, false);\n }\n }\n};\n\nexport const offAll = (action: string, type: string, callback: EventListener | EventListenerObject) => {\n elements(action).forEach((item) => {\n item.removeEventListener(type, callback, false);\n });\n};\n\nexport interface IEventChain {\n target: string;\n type: string;\n events: Array;\n}\n\nexport interface IEventChainItem {\n action?: string;\n event?: string;\n callback?: Function;\n}\n\nexport const eventChain = (arg: IEventChain) => {\n bind(arg.target, arg.type, (e) => {\n const target: any = e.target;\n let eventTarget = target?.attributes['data-action']?.value ?? target?.attributes['data-event']?.value;\n\n if (!eventTarget) eventTarget = target.parentNode?.attributes['data-action']?.value ?? target.parentNode?.attributes['data-event']?.value;\n\n if (!eventTarget) return;\n\n const item: any = arg.events.find(({ action, event }) => (action ?? event).includes(eventTarget));\n if (item?.callback) item.callback(e);\n });\n};\n\nexport const getBlazorEditMode = () => {\n if (!window.isAdminModeEnabled) {\n return false;\n }\n if (window.isEditModeEnabled !== undefined) {\n // Return value to avoid parsing cookies constantly\n return window.isEditModeEnabled;\n }\n const cookies = document.cookie.split(\";\");\n const editModeCookie = cookies.find(cookie => cookie.trim().startsWith(\"_AdminEditMode\"));\n window.isEditModeEnabled = editModeCookie?.split(\"=\")[1].toLowerCase() === \"true\";\n return window.isEditModeEnabled;\n}\n\n\n// Need to wait for blazor\n\nexport const docReady = (callback?: Function, context?: Object | string | number | boolean) => {\n\n let blazorFinishedLoadingEventRegistered: boolean = true;\n\n // Method to trigger window events\n if (!window.EasyfyMethods) {\n window.EasyfyMethods = {};\n window.EasyfyMethods.triggerWindowEvent = (eventName, eventData) => {\n if (eventName) {\n let event = new CustomEvent(eventName, {\n detail: eventData\n });\n window.dispatchEvent(event);\n }\n }\n }\n\n if (getBlazorEditMode()) {\n blazorFinishedLoadingEventRegistered = false;\n }\n\n // The public function name defaults to window.docReady\n // but you can pass in your own object and own function name and those will be used\n // if you want to put them in a different namespace\n // funcName = funcName || \"docReady\";\n // baseObj = baseObj || window;\n let readyList = [];\n let readyFired = false;\n let readyEventHandlersInstalled = false;\n\n // call this when the document is ready\n // this function protects itself against being called more than once\n const ready = () => {\n const readyBody = () => {\n if (!readyFired) {\n // this must be set to true before we start calling callbacks\n readyFired = true;\n for (var i = 0; i < readyList.length; i++) {\n // if a callback here happens to add new ready handlers,\n // the docReady() function will see that it already fired\n // and will schedule the callback to run right after\n // this event loop finishes so all handlers will still execute\n // in order and no new ones will be added to the readyList\n // while we are processing the list\n readyList[i].fn.call(window, readyList[i].ctx);\n // allow any closures held by these functions to free\n }\n readyList = [];\n }\n }\n if (getBlazorEditMode() && !window.blazorFinishedLoading) {\n if (!blazorFinishedLoadingEventRegistered) {\n blazorFinishedLoadingEventRegistered = true;\n window.addEventListener('blazorFinishedLoading', () => {\n window.blazorFinishedLoading = true;\n readyBody();\n }, false);\n }\n }\n else {\n readyBody();\n }\n\n };\n\n const readyStateChange = () => {\n if (document.readyState === 'complete') {\n ready();\n }\n };\n\n // This is the one public interface\n // docReady(fn, context);\n // the context argument is optional - if present, it will be passed\n // as an argument to the callback\n\n if (typeof callback !== 'function') {\n throw new TypeError('callback for docReady(fn) must be a function');\n }\n // if ready has already fired, then just schedule the callback\n // to fire asynchronously, but right away\n if (readyFired) {\n setTimeout(function () {\n callback(context);\n }, 1);\n return;\n } else {\n // add the function and context to the list\n readyList.push({ fn: callback, ctx: context });\n }\n // if document already ready to go, schedule the ready function to run\n if (document.readyState === 'complete') {\n setTimeout(ready, 1);\n } else if (!readyEventHandlersInstalled) {\n // otherwise if we don't have event handlers installed, install them\n if (document.addEventListener) {\n // first choice is DOMContentLoaded event\n document.addEventListener('DOMContentLoaded', ready, false);\n // backup is window load event\n window.addEventListener('load', ready, false);\n }\n readyEventHandlersInstalled = true;\n }\n};\n\nexport interface IEvent {\n type: string;\n event?: IEventItem;\n events?: Array;\n}\n\nexport interface IEventItem {\n action?: string;\n event?: string;\n callback?: Function;\n}\n\ninterface IGlobalEventItem {\n type: string;\n action?: string;\n event?: string;\n callback?: Array;\n}\n\n// Global event\nexport let globalEventList: Array = [];\n\nexport const globalEvent = (event: IEvent) => {\n event.type.split(' ').forEach((type) => {\n if (event.event) event.events = [...(event.events ?? []), ...[event.event]];\n\n if (event.events) {\n for (let item of event.events) {\n let foundItem;\n\n if (item?.action) {\n let actionFound: IGlobalEventItem = globalFindAction(type, item?.action);\n if (actionFound) {\n foundItem = actionFound;\n }\n }\n\n if (item?.event) {\n let eventFound: IGlobalEventItem = globalFindEvent(type, item?.event);\n if (eventFound) {\n foundItem = eventFound;\n }\n }\n\n if (!item?.event && !item?.action) {\n // check global state.\n let globalFound: IGlobalEventItem = globalFind(type);\n if (globalFound) {\n foundItem = globalFound;\n }\n }\n\n foundItem ? foundItem.callback.push(item.callback) : globalEventAdd(type, item);\n }\n }\n\n document.body.removeEventListener(type, globalEventHandler);\n document.body.addEventListener(type, globalEventHandler);\n });\n};\n\nexport const debounce = (func, wait) => {\n let timeout;\n\n return function executedFunction(...args) {\n const later = () => {\n clearTimeout(timeout);\n func(...args);\n };\n\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n};\n\nconst globalEventHandler = (e) => {\n const target: any = e.target;\n\n // check action\n let eventTarget = globalGetTargetAction(target);\n if (eventTarget) {\n const item: IGlobalEventItem = globalFindAction(e.type, eventTarget);\n if (item?.callback) {\n globalEventInvokeCallback(item?.callback, e);\n }\n return;\n }\n\n // check event\n eventTarget = globalGetTargetEvent(target);\n if (eventTarget) {\n const item: IGlobalEventItem = globalFindEvent(e.type, eventTarget);\n if (item?.callback) {\n globalEventInvokeCallback(item?.callback, e);\n }\n return;\n }\n\n // check event\n const item = globalMatchType(e.type);\n if (item?.callback) {\n globalEventInvokeCallback(item?.callback, e);\n return;\n }\n};\n\nconst globalEventInvokeCallback = (cbs: Array, e: any) => {\n for (let item of cbs) {\n item?.call(null, e);\n }\n};\n\nconst globalEventAdd = (type: string, item: IEventItem): void => {\n globalEventList.push({\n type: type,\n action: item?.action,\n event: item?.event,\n callback: [item?.callback],\n });\n};\n\nconst globalFind = (itemType: string): IGlobalEventItem => {\n return globalEventList.find(({ type, action, event }) => type === itemType && !action && !event);\n};\n\nconst globalFindEvent = (itemType: string, eventType: string): IGlobalEventItem => globalEventList.find(({ type, event }) => type === itemType && (event ?? '') === (eventType ?? ''));\n\nconst globalFindAction = (itemType: string, actionType: string): IGlobalEventItem => globalEventList.find(({ type, action }) => type === itemType && (action ?? '') === (actionType ?? ''));\n\nconst globalMatchType = (itemType: string): IGlobalEventItem => globalEventList.find(({ type, action, event }) => type === itemType && !action && !event);\n\nconst globalGetTargetAction = (target) => globalGetTarget(target, 'data-action');\n\nconst globalGetTargetEvent = (target) => globalGetTarget(target, 'data-event');\n\nconst globalGetTarget = (target, dataTarget: string) => {\n let eventTarget = target?.attributes[dataTarget]?.value;\n if (!eventTarget) eventTarget = target.parentNode?.attributes[dataTarget]?.value;\n return eventTarget;\n};","import { element, elements } from './easyfy.core';\n/*import mobileDetect from 'mobile-detect';*/\n\nexport interface Attribute {\n name: string;\n value: string;\n}\n\n/*export const detector = new mobileDetect(window.navigator.userAgent);*/\n\n// exemple\n// findKey(\n// {\n// barney: { age: 36, active: true },\n// fred: { age: 40, active: false },\n// pebbles: { age: 1, active: true }\n// },\n// o => o['active']\n// ); // 'barney\nexport const findKey = (obj: any, fn: any) => Object.keys(obj).find((key) => fn(obj[key], key, obj));\n\n// exemple\n// findLast([1, 2, 3, 4], n => n % 2 === 1); // 3\nexport const findLast = (arr: Array, fn: any) => arr.filter(fn).pop();\n\n// exemple\n// all([4, 2, 3], x => x > 1); // true\n// all([1, 2, 3]); // true\nexport const all = (arr: Array, fn = Boolean) => arr.every(fn);\n\n// exemple\n// allEqual([1, 2, 3, 4, 5, 6]); // false\n// allEqual([1, 1, 1, 1]); // true\nexport const allEqual = (arr: Array) => arr.every((val) => val === arr[0]);\n\n// exemple\n// arrayToHtmlList('#myListID', 'li' ,['item 1', 'item 2']);\nexport const arrayToHtmlList = (selector: string, elementType: string, arr: Array) => ((el) => ((el = document.querySelector(selector)), (el.innerHTML += arr.map((item) => `<${elementType}>${item}`).join(''))))();\n\n// exemple\n//hasClass(document.querySelector('p.special'), 'special'); // true\nexport const hasClass = (el: HTMLElement, className: string) => el?.classList?.contains(className);\n\n// exemple\n// isBrowserTabFocused(); // true\nexport const isBrowserTabFocused = () => !document.hidden;\n\n// exemple\n// isNil(null); // true\n// isNil(undefined); // true\nexport const isNil = (val: any) => val === undefined || val === null;\n\n// exemple\n// isNull(null); // true\nexport const isNull = (val: any) => val === null;\n\n// exemple\n// isNumber('1'); // false\n// isNumber(1); // true\nfunction isNumber(n: any) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n}\n\n// exemple\n// isObject([1, 2, 3, 4]); // true\n// isObject([]); // true\n// isObject(['Hello!']); // true\n// isObject({ a: 1 }); // true\n// isObject({}); // true\n// isObject(true); // false\nexport const isObject = (obj: any) => obj === Object(obj);\n\n// exemple\n// isObjectLike({}); // true\n// isObjectLike([1, 2, 3]); // true\n// isObjectLike(x => x); // false\n// isObjectLike(null); // false\nexport const isObjectLike = (val: any) => val !== null && typeof val === 'object';\n\n// exemple\n// isPlainObject({ a: 1 }); // true\n// isPlainObject(new Map()); // false\n// export const isPlainObject = (val: any) =>\n// !!val && typeof val === \"object\" && val.export && constructor === Object;\n\n// exemple\n// isString('10'); // true\nexport const isString = (val: any) => typeof val === 'string';\n\n// exemple\n// isUndefined(undefined); // true\nexport const isUndefined = (val: any) => val === undefined;\n\n// exemple\n// parse string into boolean\nexport const parseToBoolean = (val: string) => isString(val) && val?.toLowerCase() === 'true';\n\n// exemple\n// isValidJSON('{\"name\":\"Adam\",\"age\":20}'); // true\n// isValidJSON('{\"name\":\"Adam\",age:\"20\"}'); // false\n// isValidJSON(null); // true\nexport const isValidJSON = (str: string) => {\n try {\n JSON.parse(str);\n return true;\n } catch (e) {\n return false;\n }\n};\n\nexport const replaceHtml = (element: HTMLElement, html: string) => {\n if (element?.outerHTML) {\n element.outerHTML = html;\n }\n else {\n let tmpElement = document.createElement(\"div\");\n tmpElement.innerHTML = html;\n element?.parentNode?.replaceChild(tmpElement, element);\n }\n};\n\n// exemple\n// matches({ age: 25, hair: 'long', beard: true }, { hair: 'long', beard: true }); // true\n// matches({ hair: 'long', beard: true }, { age: 25, hair: 'long', beard: true }); // false\nexport const matches = (obj: any, source: any) => Object.keys(source).every((key) => obj.hasOwnProperty(key) && obj[key] === source[key]);\n\n// exemple\n// randomHexColorCode(); // \"#e34155\"\nexport const randomHexColorCode = () => {\n let n = (Math.random() * 0xfffff * 1000000).toString(16);\n return '#' + n.slice(0, 6);\n};\n\n// exemple\n// redirect('https://google.com');\nexport const redirect = (url, asLink = true) => (asLink ? (window.location.href = url) : window.location.replace(url));\n\n// exemple\n// scrollToTop();\nexport const scrollToTop = () => {\n const c = document.documentElement.scrollTop || document.body.scrollTop;\n if (c > 0) {\n window.requestAnimationFrame(scrollToTop);\n window.scrollTo(0, c - c / 8);\n }\n};\n\n// exemple\n// setStyle('p', 'font-size', '20px');\nexport const setStyle = (selector: string, ruleName: string, val: string) => (element(selector).style[ruleName] = val);\n\n// exemple\n// getStyle('p', 'font-size');\nexport const getStyle = (selector: string, ruleName: string) => element(selector).style[ruleName];\n\n// exemple\n// show(...document.querySelectorAll(\"img\")); // Shows all elements on the page\nexport const showAll = (el: Array, displayType?: string) => [...el].forEach((e) => (e.style.display = displayType || 'block'));\n\n// exemple\n// hide(document.querySelectorAll('img')); // Hides all elements on the page\nexport const hideAll = (el: Array | NodeListOf) => el.forEach((e) => (e.style.display = 'none'));\n\nexport const show = (selector: string | Element, displayType?: string) => showAll([selector instanceof Element ? selector : element(selector)], displayType);\n\nexport const hide = (selector: string | Element) => hideAll([selector instanceof Element ? selector : element(selector)]);\n\nexport const toggleShow = (selector: string, displayType?: string) => {\n const el = element(selector);\n visible(el) ? hideAll([el]) : showAll([el], displayType);\n};\n\nexport const removeCss = (el: HTMLElement | Element | Array | NodeListOf, className: string | Array) => {\n if (Array.isArray(el) || el instanceof NodeList) {\n el.forEach((element) => {\n Array.isArray(className) ? element?.classList?.remove(...className) : element?.classList?.remove(className);\n });\n } else {\n Array.isArray(className) ? (el as HTMLElement | Element)?.classList?.remove(...className) : (el as HTMLElement | Element)?.classList?.remove(className);\n return el;\n }\n};\n\nexport const addCss = (el: HTMLElement | Element, className: string | Array) => {\n if (Array.isArray(className)) {\n el?.classList?.add(...className);\n return el;\n }\n\n el?.classList?.add(className);\n return el;\n};\n\n// exemple\n// async function sleepyWork() {\n// console.log(\"I'm going to sleep for 1 second.\");\n// await sleep(1000);\n// console.log('I woke up after 1 second.');\n// }\nexport const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport const visible = (element: HTMLElement): boolean => {\n return !!(element.offsetWidth || element.offsetHeight || element.getClientRects().length);\n};\n\n// exemple\n// smoothScroll('#fooBar'); // scrolls smoothly to the element with the id fooBar\n// smoothScroll('.fooBar'); // scrolls smoothly to the first element with a class of fooBar\nexport const smoothScroll = (element: any) =>\n document.querySelector(element).scrollIntoView({\n behavior: 'smooth',\n });\n\n// exemple\n// splitLines('This\\nis a\\nmultiline\\nstring.\\n'); // ['This', 'is a', 'multiline', 'string.' , '']\nexport const splitLines = (str: string) => str.split(/\\r?\\n/);\n\n// exemple\n// stripHTMLTags('

lorem ipsum

'); // 'lorem ipsum'\nexport const stripHTMLTags = (str: string) => str.replace(/<[^>]*>/g, '');\n\n// exemple\n// sum(1, 2, 3, 4); // 10\n// sum(...[1, 2, 3, 4]); // 10\nexport const sum = (...arr: any) => [...arr].reduce((acc, val) => acc + val, 0);\n\n// exemple\n// timeTaken(() => Math.pow(2, 10)); // 1024, (logged): timeTaken: 0.02099609375ms\nexport const timeTaken = (callback: any) => {\n console.time(\"timeTaken\");\n const r = callback();\n console.timeEnd(\"timeTaken\");\n return r;\n};\n\n// exemple\n// toCurrency(123456.789, \"EUR\"); // €123,456.79 | currency: Euro | currencyLangFormat: Local\n// toCurrency(123456.789, 'USD', 'en-us'); // $123,456.79 | currency: US Dollar | currencyLangFormat: English (United States)\n// toCurrency(123456.789, 'USD', 'fa'); // ۱۲۳٬۴۵۶٫۷۹ ؜$ | currency: US Dollar | currencyLangFormat: Farsi\n// toCurrency(322342436423.2435, 'JPY'); // ¥322,342,436,423 | currency: Japanese Yen | currencyLangFormat: Local\n// toCurrency(322342436423.2435, 'JPY', 'fi'); // 322 342 436 423 ¥ | currency: Japanese Yen | currencyLangFormat: Finnish\nexport const toCurrency = (n: any, curr: any, languageFormat = undefined) =>\n Intl.NumberFormat(languageFormat, {\n style: 'currency',\n currency: curr,\n }).format(n);\n\n// exemple\n// toDecimalMark(12305030388.9087); // \"12,305,030,388.909\"\n// toDecimalMark(12305030388.9087, \"en-us\"); // \"12,305,030,388.909\"\nexport const toDecimalMark = (num: any, languageFormat = undefined) => num.toLocaleString(languageFormat);\n\n// exemple\n// toggleClass('p.special', 'special'); // The paragraph will not have the 'special' class anymore\nexport const toggleClass = (selector: string | HTMLElement, className: any, force?: boolean) => {\n //if (selector instanceof String) easyfyCore.element(selector as string).classList.toggle(className);\n\n if (selector instanceof HTMLElement) selector.classList.toggle(className, force);\n};\n\nexport const debounce = any>(func: F, waitFor: number) => {\n let timeout;\n\n return (...args: Parameters): Promise> =>\n new Promise((resolve) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => resolve(func(...args)), waitFor);\n });\n};\n\nexport const isFunction = (f: Function) => {\n return f && {}.toString.call(f) === '[object Function]';\n};\n\nexport const Id = (len: number) => {\n return '_' + Math.random().toString(36).substr(2, len);\n};\n\nexport const toggleClassBySelector = (selector: string, className: string, toggle: boolean) => {\n let els = elements(selector);\n els.forEach((item) => {\n if (toggle) {\n addCss(item, className);\n } else {\n removeCss(item, className);\n }\n });\n};\n\nexport const setAttributes = (element: HTMLElement, attributes: Array): HTMLElement | Element => {\n attributes.forEach((item) => {\n if (item?.name && item?.value) {\n element.setAttribute(item.name, item.value);\n }\n });\n return element;\n};\n\nexport const offset = (element: HTMLElement): { top: number; left: number } => {\n const rect = element.getBoundingClientRect(),\n scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,\n scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return { top: rect.top + scrollTop, left: rect.left + scrollLeft };\n};\n\nexport const winHeight = () => window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;\nexport const winWidth = () => window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;\nexport const isMobile = () => window.innerWidth <= 768 ? true : false;\n\nexport const isBetweenDates = (startDate: Date, endDate: Date, checkDate: Date) => {\n if (checkDate > startDate && checkDate < endDate) {\n return true;\n }\n return false;\n};\n\n//todo: support other short date string formats other then 2020-01-01\nexport const getDate = (date: string) => {\n if (date !== \"\") {\n var d = date.split(\"-\");\n if (d.length == 3) {\n return new Date(parseInt(d[0]), parseInt(d[1]) - 1, parseInt(d[2]));\n }\n }\n return new Date();\n};\nexport const getSelectedValue = (select: HTMLSelectElement) => {\n if (select) {\n const selectedOption = select.options[select.selectedIndex];\n return { text: selectedOption.text, value: selectedOption.value };\n }\n return;\n};\n\nexport const removeHash = () => {\n var scrollV, scrollH, loc = window.location;\n if (\"pushState\" in history) {\n history.pushState(\"\", document.title, loc.pathname + loc.search);\n } else {\n // Prevent scrolling by storing the page's current scroll offset\n scrollV = document.body.scrollTop;\n scrollH = document.body.scrollLeft;\n\n loc.hash = \"\";\n\n // Restore the scroll offset, should be flicker free\n document.body.scrollTop = scrollV;\n document.body.scrollLeft = scrollH;\n }\n};","import { docReady, event as eventHandler, events as eventsHandler, action as actionHandler, actions as actionsHandler, bind as bindHandler } from './easyfy.core';\nimport { Id } from './easyfy.utils';\n\nexport interface Idependencies {\n func: { new(...args: any[]): {} };\n data?: any;\n}\n\ninterface IActionEvent {\n target: string;\n type: string;\n meta?: object;\n}\n\ninterface IInjectorDependencies {\n name: string;\n func: object;\n}\n\ninterface IInjector {\n dependencies: {\n [key: string]: IInjectorDependencies;\n };\n resolveOnload: Array;\n resolve: (depends: Array, ctor: any, cb: Function) => void;\n}\n\nexport const invoke = function (ctor: T): void {\n let newClass: Object;\n\n const readyAfter = () => {\n // call class function onInit\n try {\n ctor?.prototype?.onInit?.apply(newClass);\n } catch (error) {\n console.log('Invoke onInit error', error);\n }\n };\n\n const init = (resolves?: Array) => {\n try {\n newClass = new ctor(...(resolves || []));\n } catch (err) {\n console.log('Error ', err);\n }\n\n if (ctor.prototype.hasOwnProperty('onInit')) {\n // Use the handy event callback\n docReady(readyAfter);\n }\n };\n\n const depends = ctor['depends'];\n depends\n ? injector.resolve(ctor['depends'], ctor, (resolves) => {\n delete ctor['depends'];\n init(resolves);\n })\n : init();\n};\n\n\nconst injector: IInjector = {\n dependencies: {},\n resolveOnload: [],\n resolve: function (depends: Array, ctor: any, cb?: Function): void {\n depends.forEach((item) => {\n const id = Id(10);\n injector.dependencies[id] = { name: id, func: new item.func(item.data || {}) };\n if (injector.dependencies[id].func.hasOwnProperty('loaded')) {\n injector.resolveOnload.push(id);\n }\n });\n\n if (injector.resolveOnload.length > 0) {\n injector.resolveOnload.forEach((item, index) => {\n if (injector.dependencies[item].func.hasOwnProperty('loaded')) {\n const dependencyItem = injector.dependencies[item].func;\n\n let loadedVal = dependencyItem['loaded'];\n Object.defineProperty(dependencyItem, 'loaded', {\n get: () => {\n return loadedVal;\n },\n set: function (val) {\n if (val !== loadedVal) {\n if (val) {\n if (dependencyItem) {\n injector.resolveOnload.splice(index, 1);\n delete dependencyItem['loaded'];\n\n if (injector.resolveOnload.length === 0 && cb) {\n let dependencyFunc: Array = [];\n for (const key in injector.dependencies) {\n if (injector.dependencies.hasOwnProperty(key)) {\n const item = injector.dependencies[key];\n dependencyFunc.push(item.func);\n }\n }\n cb.call(this, dependencyFunc);\n }\n }\n }\n }\n\n loadedVal = val;\n },\n enumerable: true,\n configurable: true,\n });\n }\n });\n } else {\n cb?.call(this);\n }\n },\n};\n\ntype InferValue = Desc extends { get(): any; value: any } ? never : Desc extends { value: infer T } ? Record : Desc extends { get(): infer T } ? Record : never;\n\ntype DefineProperty = Desc extends { writable: any; set(val: any): any }\n ? never\n : Desc extends { writable: any; get(): any }\n ? never\n : Desc extends { writable: false }\n ? Readonly>\n : Desc extends { writable: true }\n ? InferValue\n : Readonly>;\n\nfunction defineProperty(obj: Obj, prop: Key, val: PDesc): asserts obj is Obj & DefineProperty {\n Object.defineProperty(obj, prop, val);\n}\n\ndefineProperty(Object.prototype, 'watch', {\n enumerable: false,\n configurable: true,\n writable: false,\n value(this: any, prop, handler) {\n let oldval: any = this[prop],\n newval: any = oldval,\n getter = function () {\n return newval;\n },\n setter = function (this: any, val) {\n oldval = newval;\n return (newval = handler.call(this, prop, oldval, val));\n };\n\n if (delete this[prop]) {\n // can't watch constants\n Object.defineProperty(this, prop, {\n get: getter,\n set: setter,\n enumerable: true,\n configurable: true,\n });\n }\n },\n});\n\nexport const event = (event: IActionEvent) => {\n return (_target: any, _key: string, descriptor: PropertyDescriptor) => {\n eventHandler(event.target, event.type, actionEventHelper(descriptor, event.meta).value);\n };\n};\n\nexport const events = (event: IActionEvent) => {\n return (_target: any, _key: string, descriptor: PropertyDescriptor) => {\n eventsHandler(event.target, event.type, actionEventHelper(descriptor, event.meta).value);\n };\n};\n\nexport const action = (event: IActionEvent) => {\n return (_target: any, _key: string, descriptor: PropertyDescriptor) => {\n actionHandler(event.target, event.type, actionEventHelper(descriptor, event.meta).value);\n };\n};\n\nexport const actions = (event: IActionEvent) => {\n return (_target: any, _key: string, descriptor: PropertyDescriptor) => {\n actionsHandler(event.target, event.type, actionEventHelper(descriptor, event.meta).value);\n };\n};\n\nexport const bind = (event: IActionEvent) => {\n return (_target: any, _key: string, descriptor: PropertyDescriptor) => {\n bindHandler(event.target, event.type, actionEventHelper(descriptor, event.meta).value);\n };\n};\n\nconst actionEventHelper = (descriptor: PropertyDescriptor, meta?: object) => {\n const decorated: Function = descriptor.value;\n descriptor.value = function (event: Event) {\n if (event?.preventDefault) event?.preventDefault();\n\n return decorated.apply(this, [...Array.from(arguments), meta]);\n };\n return descriptor;\n};","import { event } from \"../easyfy.core\";\nimport { LocalStorageKeys } from \"./easyfy.eventhandler\";\nimport { parseToBoolean } from '../easyfy.utils';\n\ndeclare global {\n interface Window {\n EasyfyEventLayer: any,\n EasyfyEventLayerInstance: any\n isEditModeEnabled?: boolean;\n isAdminModeEnabled?: boolean;\n blazorFinishedLoading?: boolean;\n EasyfyMethods: any;\n }\n}\n\nexport interface IDataMapper {\n MapEventData(event: IEasyfyEvent): any;\n}\n\nexport interface IEasyfyEventExporter {\n mapper: IDataMapper;\n WithMapper(mapper: IDataMapper): void;\n RegisterEvent(event: IEasyfyEvent): Promise;\n};\n\nexport interface IEasyfyEvent {\n eventName: string;\n data: any;\n}\n\nexport interface IEasyfyEventService {\n name: string;\n includeAllEvents: boolean;\n events: string;\n enabled: boolean;\n}\n\nexport interface IEasyfySiteInfo {\n currencyCode: string;\n checkoutPath: string;\n}\n\nexport interface IEasyfyPageInfo {\n PageType: string;\n ViewName: string;\n}\n\nexport interface IProductData {\n Id: any;\n DomainId: any;\n Ean: any;\n DisplayName: any;\n Brand: any;\n Categories: any[];\n Price: number;\n PriceExVat: number;\n CampaignCode: string;\n AbsoluteProductUrl: string;\n RelativeProductUrl: string;\n ProductImageUrl: string;\n}\n\nexport interface IProductSalesUnitPrice {\n salesUnitsCode: string;\n packSize: number;\n priceExVat: number;\n priceIncVat: number;\n}\n\nexport interface IBasket {\n priceIncVat: number;\n priceExVat: number;\n priceIncVatExShipping: number;\n vat: number;\n rows: IBasketRow[];\n}\n\nexport interface IBasketRow {\n productIdentifier: string;\n qty: number;\n salesUnitCode: string;\n purchaseFlow: string;\n}\n\nexport interface IProductList {\n ListName: string;\n ListId: string;\n ProductIds: string[];\n}\n\nexport interface IBannerData {\n Id: any;\n DisplayName: any;\n PageUrl: any;\n LinkUrl: any;\n}\n\nexport interface ISearchPerformedData {\n searchString: string;\n source: string;\n productIdentifiers: any[];\n productHits: number;\n articleHits: number;\n brandHits: number;\n pageHits: number;\n totalProductResults: number;\n suggestions: any[];\n}\n\nexport interface IPageViewData {\n pageId: string;\n searchPageId: string;\n}\n\nexport interface IEventNotification {\n message: string;\n severity: string;\n}\n\nexport interface IQuantityChangedData {\n productIdentifier: string;\n listName: string;\n salesUnitCode: string;\n oldQuantity: number;\n newQuantity: number;\n}\n\nexport interface ISessionStarted {\n Culture: string;\n Currency: string;\n IsDesktop: boolean;\n IsMobilePhone: boolean;\n IsTablet: boolean;\n RecurringUser: boolean;\n Referrer: string;\n Path: string;\n UserAgent: string;\n SessionId: string;\n ClientId: string;\n UserId: string;\n VisitorId: string;\n}\n\nexport interface IWorkerJob {\n readonly Type: string;\n Data: any;\n Runs: number;\n MaxRuns: number;\n\n RunJob(data: any): Promise;\n AnonymizeWithDbId(db_id: any): any;\n}\n\nexport interface IWorkerMessage {\n Message: string;\n Data: any;\n}\n\nexport interface ITrackableElement {\n Id: any;\n Type: any;\n Properties: Map;\n}\n\nexport interface IClientEventMetaData {\n ClientId: string;\n UserId: string;\n SessionId: string;\n IsDesktop: boolean;\n IsMobilePhone: boolean;\n IsTablet: boolean;\n IPAddress: string;\n}\n\nexport interface IStatsEventData {\n ClientMetaData: IClientEventMetaData;\n EventRequests: any[];\n}\n\nexport module EasyfyEventData {\n export function AddDataToEventLayer(data: any): void {\n if (data) {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n data.events.forEach((event: any) => {\n if (!window.EasyfyEventLayer.events) {\n window.EasyfyEventLayer.events = [];\n }\n window.EasyfyEventLayer.events.push(event);\n });\n\n window.EasyfyEventLayer.products = window.EasyfyEventLayer.products || {};\n\n for (const product in data.products) {\n if (!window.EasyfyEventLayer.products || window.EasyfyEventLayer.products[product]) continue;\n window.EasyfyEventLayer.products[product] = data.products[product];\n }\n\n window.EasyfyEventLayer.productLists = window.EasyfyEventLayer.productLists || {};\n\n for (const productList in data.productLists) {\n //overwrite product list values when updated\n if (!window.EasyfyEventLayer.productLists || !window.EasyfyEventLayer.productLists[productList]) continue;\n window.EasyfyEventLayer.productLists[productList] = data.productLists[productList];\n }\n\n window.EasyfyEventLayer.productPrices = window.EasyfyEventLayer.productPrices || {};\n\n for (const price in data.productPrices) {\n //no need to overwrite price entries already in place\n if (!window.EasyfyEventLayer.productPrices || window.EasyfyEventLayer.productPrices[price]) continue;\n window.EasyfyEventLayer.productPrices[price] = data.productPrices[price];\n }\n\n window.EasyfyEventLayer.basket = window.EasyfyEventLayer.basket || {};\n\n if (data.basket) {\n window.EasyfyEventLayer.basket = data.basket;\n }\n\n for (const notification in data.notifications) {\n if (!window.EasyfyEventLayer.notifications) continue;\n window.EasyfyEventLayer.notifications.push(notification);\n }\n }\n }\n\n export function AddCustomDataToEventLayer(data: Map): void {\n\n if (!data) return;\n\n if (!window.EasyfyEventLayer.customData) {\n window.EasyfyEventLayer.customData = {};\n }\n data.forEach((value: object, key: string) => {\n window.EasyfyEventLayer.customData[key] = value;\n })\n }\n\n export function GlobalIgnoreEvents(): boolean {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n var result: boolean;\n if (window.EasyfyEventLayer.configuration?.addProductImpressionsServerSide != undefined) {\n result = (window.EasyfyEventLayer.configuration.addProductImpressionsServerSide as boolean) == false;\n }\n\n return result;\n }\n\n export function SiteInfo(): IEasyfySiteInfo {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n var result: IEasyfySiteInfo;\n if (window.EasyfyEventLayer.site) {\n result = window.EasyfyEventLayer.site as IEasyfySiteInfo;\n }\n\n return result;\n }\n\n export function PageInfo(): IEasyfyPageInfo {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n var result: IEasyfyPageInfo;\n if (window.EasyfyEventLayer.pageInfo) {\n result = window.EasyfyEventLayer.pageInfo as IEasyfyPageInfo;\n }\n\n return result;\n }\n\n export function Events(): IEasyfyEvent[] {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n var result: IEasyfyEvent[] = [];\n if (window.EasyfyEventLayer.events) {\n result = window.EasyfyEventLayer.events as IEasyfyEvent[];\n }\n\n return result;\n }\n\n export function ClearEvents(): void {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n if (window.EasyfyEventLayer.events) {\n window.EasyfyEventLayer.events = [];\n }\n }\n\n export function ShouldRegisterProductImpressions(): boolean {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n var result: boolean;\n if (window.EasyfyEventLayer.configuration?.addProductImpressionsServerSide != undefined) {\n result = (window.EasyfyEventLayer.configuration.addProductImpressionsServerSide as boolean) == false;\n }\n\n return result;\n }\n\n export function ShouldRegisterBannerImpressions(): boolean {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n var result: boolean;\n if (window.EasyfyEventLayer.configuration?.addBannerImpressionsServerSide != undefined) {\n result = (window.EasyfyEventLayer.configuration.addBannerImpressionsServerSide as boolean) == false;\n }\n\n return result;\n }\n\n export function GetAllServices(): IEasyfyEventService[] {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n var result: IEasyfyEventService[] = [];\n if (window.EasyfyEventLayer?.configuration?.services) {\n result = window.EasyfyEventLayer.configuration.services as IEasyfyEventService[];\n }\n\n return result;\n }\n\n export function GetService(serviceName: string): IEasyfyEventService {\n var service = EasyfyEventData.GetAllServices().find(serviceInstance => serviceInstance.name.toLowerCase() == serviceName.toLowerCase());\n return service;\n }\n\n export function GetServiceNames(): string[] {\n var result: string[] = [];\n EasyfyEventData.GetAllServices().forEach(service => result.push(service.name));\n return result;\n }\n\n export function ServiceIsActive(serviceName: string): boolean {\n var service = EasyfyEventData.GetAllServices().find(serviceInstance => serviceInstance.name.toLowerCase() == serviceName.toLowerCase());\n return (service && service.enabled);\n }\n\n export function ConsumesEvent(serviceName: string, eventName: string): boolean {\n var service = EasyfyEventData.GetService(serviceName);\n if (!service || !service.enabled) return false;\n if (service.includeAllEvents) {\n return true;\n }\n else {\n var serviceConsumables = service.events?.trim().replace(/\\s/g, '').split(\",\");\n return serviceConsumables.find(event => event.trim().toLowerCase() == eventName.toLowerCase()) != undefined ?? false;\n }\n }\n\n export function Product(id: string): T | undefined {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n var result: T = null;\n if (window.EasyfyEventLayer.products) {\n result = window.EasyfyEventLayer.products[id] as T;\n }\n return result;\n }\n\n export function ProductAt(atIndex: number): T | undefined {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n var result: T = null;\n try {\n if (window.EasyfyEventLayer.products) {\n result = window.EasyfyEventLayer.products[atIndex] as T;\n }\n }\n catch (error) { }\n\n return result;\n }\n\n export function Products(ids: string[]): T[] {\n var productDataSet: T[] = [];\n ids.forEach((id) => {\n productDataSet.push(EasyfyEventData.Product(id));\n });\n return productDataSet;\n }\n\n export function ProductsAt(indexes: number[]): T[] {\n var productDataSet: T[] = [];\n indexes.forEach((index) => {\n productDataSet.push(EasyfyEventData.ProductAt(index));\n });\n return productDataSet;\n }\n\n export function AllProducts(): T[] {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n var result: T[] = [];\n if (window.EasyfyEventLayer.products) {\n result = window.EasyfyEventLayer.products as T[];\n }\n return result;\n }\n export function AllProductLists(): IProductList[] {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n var result = [];\n if (window.EasyfyEventLayer.productLists) {\n result = window.EasyfyEventLayer.productLists;\n }\n return result;\n }\n\n export function ProductIndexInList(listName: string, productId: string): number | null {\n if (!listName || !productId) return null;\n var productsInList = window.EasyfyEventLayer.productLists[listName] as IProductList;\n if (!productsInList || !productsInList?.ProductIds) return null;\n var indexOfProduct = productsInList.ProductIds.indexOf(productId);\n\n return indexOfProduct;\n }\n\n export function ProductSalesUnitPrice(id: string): IProductSalesUnitPrice | undefined {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n var result: IProductSalesUnitPrice = null;\n\n if (window.EasyfyEventLayer.productPrices) {\n result = window.EasyfyEventLayer.productPrices[id] as IProductSalesUnitPrice;\n }\n\n return result;\n }\n\n export function ProductSalesUnitPrices(ids: string[]): IProductSalesUnitPrice[] | undefined {\n var prices: IProductSalesUnitPrice[] = [];\n ids.forEach((id) => {\n prices.push(EasyfyEventData.ProductSalesUnitPrice(id));\n });\n return prices;\n }\n\n export function AllProductSalesUnitPrices(): IProductSalesUnitPrice[] {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n var result: IProductSalesUnitPrice[] = [];\n\n if (window.EasyfyEventLayer.productPrices) {\n result = window.EasyfyEventLayer.productPrices as IProductSalesUnitPrice[];\n }\n\n return result;\n }\n\n export function Banner(id: string): IBannerData | undefined {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n var result: IBannerData = null;\n if (window.EasyfyEventLayer.banners) {\n result = window.EasyfyEventLayer.banners[id] as IBannerData;\n }\n return result;\n }\n\n export function AllBanners(): IBannerData[] {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n var result: IBannerData[] = [];\n if (window.EasyfyEventLayer.banners) {\n result = window.EasyfyEventLayer.banners as IBannerData[];\n }\n return result;\n }\n\n export function HasNotifications(): boolean {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n return (window.EasyfyEventLayer && window.EasyfyEventLayer.notifications?.length > 0);\n }\n\n export function Notifications(): IEventNotification[] {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n var result: IEventNotification[] = [];\n if (window.EasyfyEventLayer.notifications) {\n result = window.EasyfyEventLayer.notifications as IEventNotification[];\n }\n return result;\n }\n export function ClearNotifications():void {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n if (window.EasyfyEventLayer.notifications) {\n window.EasyfyEventLayer.notifications = [];\n }\n }\n\n export function HasEvents(): boolean {\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n return (window.EasyfyEventLayer && window.EasyfyEventLayer.events?.length > 0);\n };\n\n export function Basket(): IBasket {\n window.EasyfyEventLayer.basket = window.EasyfyEventLayer.basket || {};\n var result: IBasket;\n if (window.EasyfyEventLayer.basket) {\n result = window.EasyfyEventLayer.basket as IBasket;\n }\n return result;\n };\n\n export function GetCurrencyCode(): string {\n var returnValue = null;\n window.EasyfyEventLayer = window.EasyfyEventLayer || {};\n if (window.EasyfyEventLayer && window.EasyfyEventLayer.site) {\n returnValue = window.EasyfyEventLayer.site.currencyCode as string;\n }\n\n return returnValue;\n };\n\n export function GetCustomData(key: string): any {\n if (!window.EasyfyEventLayer.customData) {\n window.EasyfyEventLayer.customData = {};\n }\n return window.EasyfyEventLayer.customData[key];\n }\n\n export function GetClientEventMetaData(): IClientEventMetaData {\n var result: IClientEventMetaData = {\n SessionId: localStorage.getItem(LocalStorageKeys.SessionId),\n UserId: localStorage.getItem(LocalStorageKeys.UserId),\n ClientId: localStorage.getItem(LocalStorageKeys.ClientId),\n IsDesktop: parseToBoolean(localStorage.getItem(LocalStorageKeys.IsDekstop)),\n IsMobilePhone: parseToBoolean(localStorage.getItem(LocalStorageKeys.IsMobilePhone)),\n IsTablet: parseToBoolean(localStorage.getItem(LocalStorageKeys.IsTablet)),\n IPAddress: localStorage.getItem(LocalStorageKeys.IPAddress)\n }\n return result;\n }\n\n export function IsRecurringUser(flagAsRecurringAfterCheck: boolean): boolean {\n var cookieKey = localStorage.getItem(LocalStorageKeys.UserIdCookieKey);\n var userId = EasyfyEventData.GetCookieValue(cookieKey);\n var lastCheckedUserId = localStorage.getItem(LocalStorageKeys.LastCheckedUserId);\n var result = false\n\n if (userId == lastCheckedUserId) {\n result = true;\n }\n\n if (flagAsRecurringAfterCheck) {\n localStorage.setItem(LocalStorageKeys.LastCheckedUserId, userId);\n }\n\n return result;\n }\n\n export function GetCookieValue(cookieName) {\n let cookie = {};\n document.cookie.split(';').forEach(function (el) {\n let [key, value] = el.split('=');\n cookie[key.trim()] = value;\n })\n return cookie[cookieName];\n }\n export function SetStatsApiBlock(block: boolean) {\n if (block) {\n localStorage.setItem(LocalStorageKeys.StatsIsBlocked, \"1\");\n }\n else {\n localStorage.removeItem(LocalStorageKeys.StatsIsBlocked);\n }\n }\n export function StatsApiIsBlocked(): boolean {\n var blockedFlag = localStorage.getItem(LocalStorageKeys.StatsIsBlocked);\n\n if (blockedFlag) {\n return true;\n }\n\n return false;\n }\n}\n\n","import { IEasyfyEvent, IDataMapper, IEasyfyEventExporter, EasyfyEventData, IStatsEventData } from '@shared/easyfy.events/easyfy.eventdata';\nimport { EventNames, LocalStorageKeys } from '../easyfy.eventhandler';\n\n/* Stats Exporter class */\nexport class StatsEventExporter implements IEasyfyEventExporter {\n private _eventData: IStatsEventData;\n private _blob: Blob;\n private readonly _payloadKbThreshold: number = 50;\n private readonly _eventThreshold: number = 3;\n private _eventThresholdRemoved: boolean = false;\n\n mapper: IDataMapper;\n async WithMapper(mapper: IDataMapper): Promise {\n this.mapper = mapper;\n await this.LoadAndSetTransitionStatus();\n document.addEventListener(\"visibilitychange\", this.CheckVisibility.bind(this));\n }\n\n public RegisterEvent(event: IEasyfyEvent): Promise {\n return new Promise(async (resolve) => {\n if (this.mapper) {\n if (!EasyfyEventData.StatsApiIsBlocked()) {\n const eventData = this.mapper.MapEventData(event);\n if (eventData) {\n if (Array.isArray(eventData)) {\n eventData.forEach(async (event) => {\n await this.AccumulateEvent(event);\n });\n }\n else {\n await this.AccumulateEvent(eventData);\n }\n }\n }\n }\n resolve();\n });\n }\n\n private async LoadAndSetTransitionStatus(): Promise {\n const eventThresholdRemoved = localStorage.getItem(LocalStorageKeys.StatsEventsThresholdRemoved);\n if (eventThresholdRemoved === \"true\") {\n this._eventThresholdRemoved = true;\n return;\n }\n\n const storedDataString = localStorage.getItem(LocalStorageKeys.StatsEventsTransitionObj);\n if (storedDataString) {\n\n try {\n this._eventData = JSON.parse(storedDataString) as IStatsEventData;\n } catch (error) {\n this._eventData = {\n ClientMetaData: null,\n EventRequests: []\n };\n }\n }\n }\n\n private async RecheckAndSetTransitionStatus(): Promise {\n\n let eventsMatch = 0;\n const skipEventNames = [EventNames.BannerImpression, EventNames.ElementImpression, EventNames.ProductImpression];\n\n for (const event of this._eventData?.EventRequests) {\n if (skipEventNames.includes(event?.Event?.type?.toLowerCase()) == false) {\n eventsMatch++;\n }\n }\n\n if (eventsMatch >= this._eventThreshold) {\n localStorage.setItem(LocalStorageKeys.StatsEventsThresholdRemoved, \"true\");\n this._eventThresholdRemoved = true;\n localStorage.removeItem(LocalStorageKeys.StatsEventsTransitionObj);\n }\n else {\n localStorage.setItem(LocalStorageKeys.StatsEventsTransitionObj, JSON.stringify(this._eventData));\n }\n }\n\n private async AccumulateEvent(event: any): Promise {\n return new Promise(async (resolve) => {\n if (!this._eventData || !this._eventData?.ClientMetaData || !this._eventData?.EventRequests) {\n this._eventData = {\n ClientMetaData: EasyfyEventData.GetClientEventMetaData(),\n EventRequests: []\n }\n }\n\n this._eventData.EventRequests.push({ \"Event\": event });\n\n const str = JSON.stringify(this._eventData);\n const bytes = new TextEncoder().encode(str);\n const blob = new Blob([bytes], {\n type: \"application/json;charset=utf-8\"\n });\n\n this._blob = blob;\n\n if (this._eventThresholdRemoved) {\n const payloadSize = await this.GetObjectSizeInKB(this._eventData);\n if (payloadSize > this._payloadKbThreshold) {\n await this.SendEventsToStatsApi();\n }\n }\n else {\n await this.RecheckAndSetTransitionStatus();\n }\n\n resolve();\n });\n }\n\n private async SendEventsToStatsApi(): Promise {\n if (this._eventData?.ClientMetaData && this._eventData?.EventRequests?.length > 0 && this._blob) {\n navigator.sendBeacon(\"/api/stats/events\", this._blob);\n this._eventData = null;\n this._blob = null;\n }\n }\n\n private async CheckVisibility() {\n if (document.visibilityState === \"hidden\" && this._eventThresholdRemoved) {\n await this.SendEventsToStatsApi();\n }\n }\n\n async GetObjectSizeInKB(obj: any): Promise {\n\n const jsonString = JSON.stringify(obj);\n const bytes = new TextEncoder().encode(jsonString).length;\n const kilobytes = bytes / 1024;\n\n return kilobytes;\n }\n}","import { EasyfyEventData, IEventNotification } from '@shared/easyfy.events/easyfy.eventdata';\nimport { IEasyfyEvent } from './easyfy.eventdata';\n\ndeclare var process: {\n env: {\n NODE_ENV: string\n }\n}\n\nexport module EasyfyEventLogger {\n\n const topParagraphStyle: string = \"line-height:6px; border-radius: 5px; width: fit-content;\";\n const paragraphStyle: string = \"line-height:6px; padding:6px; border-radius: 5px; width: fit-content;\";\n\n let _channelName: string = \"event_logger_channel\";\n let _broadcastChannel: BroadcastChannel = new BroadcastChannel(_channelName);\n\n export function ConsoleLog(message: string, prefix?: string, color?: string, bgColor?: string) {\n if (process.env.NODE_ENV === \"development\") {\n if (color == undefined) {\n color = '#ffffff';\n }\n\n var style = `color: ${color};`;\n\n if (bgColor) {\n style += `background: ${bgColor};`;\n }\n\n console.log(`%c ${prefix}${message}`, style);\n }\n }\n\n export function Log(this: any, obj): void {\n if (process.env.NODE_ENV === \"development\") {\n //return;\n\n try {\n var haveInjectedCss = window[\"injectedCss\"];\n if (!haveInjectedCss) {\n window[\"injectedCss\"] = true;\n var injectedCss = window.document.styleSheets[0];\n injectedCss.insertRule(`\n @keyframes messageFlash {\n 0% { background-color: rgba(255, 255, 255, 0);}\n 50% { background-color: rgba(255, 255, 255, 0.5);}\n 100% { background-color: rgba(255, 255, 255, 0);}\n }\n `, injectedCss.cssRules.length);\n\n injectedCss.insertRule(`.flash{\n animation: messageFlash 0.2s 2;\n }`, injectedCss.cssRules.length);\n\n injectedCss.insertRule(`\n @keyframes impressionBorder {\n 0% { border: 0px solid #ff7600; }\n 100% { border: 8px solid #ff7600; }\n }\n `, injectedCss.cssRules.length);\n\n injectedCss.insertRule(`.impressionSeen{\n animation: impressionBorder 0.8s 1;\n border: 8px solid #ff7600;\n }`, injectedCss.cssRules.length);\n\n injectedCss.insertRule(`#debugEventConsumer div{\n font-size: 12px;\n margin: 0px;\n padding: 0px;\n display: flex;\n\n .time{\n color:#8f8f8f;\n }\n\n pre {\n margin: 0 5px;\n\n span{\n color: #1fb5ff;\n }\n }\n }`, injectedCss.cssRules.length);\n\n \n }\n }\n catch (error) {\n console.warn(error);\n }\n\n var devEventLogButton = document.querySelector(\"#devEventLogButton\");\n if (!devEventLogButton) {\n var logButtonElem = document.createElement('div');\n logButtonElem.id = \"devEventLogButton\";\n logButtonElem.style.position = \"fixed\";\n logButtonElem.style.cursor = \"pointer\";\n logButtonElem.style.bottom = \"5px\";\n logButtonElem.style.left = \"5px\";\n logButtonElem.style.width = \"10px\";\n logButtonElem.style.height = \"10px\";\n logButtonElem.style.fontSize = \"10px\";\n logButtonElem.style.zIndex = \"2147483645\";\n\n logButtonElem.onclick = this.EnableLog;\n logButtonElem.innerHTML = \"🖥️\";\n\n document.querySelector('body').appendChild(logButtonElem);\n }\n\n var devEventOutput = document.querySelector(\"#devEventOutput\");\n if (!devEventOutput) {\n var outputDiv = document.createElement('div');\n outputDiv.id = \"devEventOutput\";\n outputDiv.style.position = \"fixed\";\n outputDiv.style.backgroundColor = \"#000000de\";\n outputDiv.style.color = \"#c4c4c4\";\n outputDiv.style.zIndex = \"2147483646\";\n outputDiv.style.width = \"100%\";\n outputDiv.style.height = \"200px\";\n outputDiv.style.bottom = \"0\";\n outputDiv.style.fontSize = \"10px\";\n outputDiv.style.fontFamily = \"Roboto, Helvetica\";\n outputDiv.style.lineHeight = \"4px\";\n outputDiv.style.display = \"grid\";\n outputDiv.style.gridTemplateColumns = \"120px 1fr\";\n outputDiv.style.gridTemplateRows = \"30px 1fr\";\n\n var topElement = document.createElement('div');\n topElement.style.position = \"sticky\";\n topElement.style.top = \"0px\";\n topElement.style.width = \"100%\";\n topElement.style.height = \"30px\";\n topElement.style.padding = \"7px 5px\";\n topElement.style.color = \"#73ff69\";\n topElement.style.display = \"flex\";\n topElement.style.gridGap = \"20px\";\n topElement.style.gridColumn = \"2\";\n topElement.style.gridRow = \"1\";\n\n topElement.innerHTML = '

EventLayer.Services: No registered

' +\n '

EventLayer.Products: 0

' +\n '

EventLayer.ProductLists: 0

' +\n '

EventLayer.ProductPrices: 0

' +\n '

EventLayer.Banners: 0

' +\n '

Product impressions: 0

' +\n '

' +\n '

';\n\n var leftElement = document.createElement('div');\n leftElement.style.width = \"120px;\"\n leftElement.style.height = \"30px\";\n leftElement.style.gridColumn = \"1\";\n leftElement.style.gridRow = \"1\";\n leftElement.style.display = \"flex\";\n\n var iconParagraph1 = document.createElement('p');\n iconParagraph1.style.cursor = \"pointer\";\n iconParagraph1.style.width = \"30px\";\n iconParagraph1.style.height = \"30px\";\n iconParagraph1.style.padding = \"0px 6px\";\n iconParagraph1.style.lineHeight = \"30px\";\n iconParagraph1.onclick = EasyfyEventLogger.DisableLog;\n iconParagraph1.innerHTML = \"🖥️\";\n\n leftElement.appendChild(iconParagraph1);\n\n var iconParagraph2 = document.createElement('p');\n iconParagraph2.style.cursor = \"pointer\";\n iconParagraph2.style.width = \"30px\";\n iconParagraph2.style.height = \"30px\";\n iconParagraph2.style.padding = \"0px 6px\";\n iconParagraph2.style.lineHeight = \"30px\";\n iconParagraph2.onclick = EasyfyEventLogger.PrintEventLayer;\n iconParagraph2.innerHTML = \"📄\";\n\n leftElement.appendChild(iconParagraph2);\n\n var iconParagraph3 = document.createElement('p');\n iconParagraph3.style.cursor = \"pointer\";\n iconParagraph3.style.width = \"30px\";\n iconParagraph3.style.height = \"30px\";\n iconParagraph3.style.padding = \"0px 8px\";\n iconParagraph3.style.lineHeight = \"30px\";\n iconParagraph3.style.transform = \"scale(1.6)\";\n\n if (ImpressionVisualizerIsOn()) {\n iconParagraph3.style.color = \"#ff7600\";\n } else {\n iconParagraph3.style.color = \"#c4c4c4\";\n }\n\n iconParagraph3.id = \"toggleImpressionBtn\"\n iconParagraph3.onclick = EasyfyEventLogger.ToggleImpressionVisualizer;\n iconParagraph3.innerHTML = \"👁\";\n\n leftElement.appendChild(iconParagraph3);\n\n var iconParagraph4 = document.createElement('p');\n iconParagraph4.style.cursor = \"pointer\";\n iconParagraph4.style.width = \"30px\";\n iconParagraph4.style.height = \"30px\";\n iconParagraph4.style.padding = \"0px 8px\";\n iconParagraph4.style.lineHeight = \"30px\";\n iconParagraph4.style.transform = \"scale(1.6)\";\n iconParagraph4.onclick = EasyfyEventLogger.RunEventConsumer;\n iconParagraph4.innerHTML = \"📡\";\n\n leftElement.appendChild(iconParagraph4);\n\n\n var textElement = document.createElement('div');\n textElement.id = \"outputText\";\n textElement.style.padding = \"5px\";\n textElement.style.overflowY = \"scroll\";\n textElement.style.height = \"170px\";\n textElement.style.gridColumn = \"2\";\n textElement.style.gridRow = \"2\";\n textElement.style.borderRadius = \"5px\";\n\n outputDiv.appendChild(topElement);\n outputDiv.appendChild(leftElement);\n outputDiv.appendChild(textElement);\n document.querySelector('body').appendChild(outputDiv);\n\n this.CheckLogStatus();\n }\n\n devEventOutput = document.querySelector(\"#devEventOutput\");\n if (!devEventOutput) return;\n\n if (obj.type == \"productimpression\") {\n var textOutput = devEventOutput.querySelector('#outputText');\n textOutput.innerHTML += \"

\" + obj.message + \"

\";\n var productImpressions = Number.parseInt(devEventOutput.querySelector('#devProductImpressions').innerHTML);\n devEventOutput.querySelector('#devProductImpressions').innerHTML = (productImpressions + 1).toString();\n\n textOutput.scrollTop = textOutput.scrollHeight;\n\n if (obj.target && ImpressionVisualizerIsOn()) {\n (obj.target as HTMLElement).classList.add(\"impressionSeen\")\n }\n\n BroadcastToLogger(obj.message);\n }\n else if (obj.type == \"servicesregistered\") {\n devEventOutput.querySelector('#devEventServices').innerHTML = obj.message;\n\n BroadcastToLogger(obj.message);\n }\n else if (obj.type == \"updateeventlayerstatus\") {\n var lists = EasyfyEventData.AllProductLists();\n var products = EasyfyEventData.AllProducts();\n var banners = EasyfyEventData.AllBanners();\n var prices = EasyfyEventData.AllProductSalesUnitPrices();\n\n var eventLayerProductsCount = Object.keys(products).length;\n var eventLayerProductListsCount = Object.keys(lists).length;\n var eventLayerBannersCount = Object.keys(banners).length;\n var eventLayerPricesCount = Object.keys(prices).length;\n\n devEventOutput.querySelector('#devLayerLists').innerHTML = eventLayerProductListsCount.toString();\n devEventOutput.querySelector('#devLayerProducts').innerHTML = eventLayerProductsCount.toString();\n devEventOutput.querySelector('#devEventServices').innerHTML = EasyfyEventData.GetServiceNames().join(\", \");\n devEventOutput.querySelector('#devLayerBanners').innerHTML = eventLayerBannersCount.toString();\n devEventOutput.querySelector('#devLayerPrices').innerHTML = eventLayerPricesCount.toString();\n\n var notifications = EasyfyEventData.Notifications();\n\n var textOutput = devEventOutput.querySelector('#outputText');\n notifications.forEach((notification: IEventNotification) => {\n\n var color = \"#ffffff\";\n var message = notification.severity + \": \" + notification.message;\n switch (notification?.severity) {\n case \"Warning\":\n color = \"#ffd76a\";\n console.warn(message);\n let warn = devEventOutput.querySelector('#devlogger-warning-sign') as HTMLElement;\n warn.style.display = \"block\";\n break;\n case \"Error\":\n color = \"#ff6a6a\";\n console.error(message);\n let err = devEventOutput.querySelector('#devlogger-warning-sign') as HTMLElement;\n err.style.display = \"block\";\n break;\n }\n textOutput.innerHTML += \"

\" + notification.message + \"

\";\n\n BroadcastToLogger(notification);\n });\n textOutput.scrollTop = textOutput.scrollHeight;\n EasyfyEventData.ClearNotifications();\n }\n else if (obj.type == \"event\") {\n var textOutput = devEventOutput.querySelector('#outputText');\n textOutput.className = \"\";\n textOutput.innerHTML += \"

\" + obj.message + \"

\";\n textOutput.scrollTop = textOutput.scrollHeight;\n setTimeout(() => {\n var textOutput = devEventOutput.querySelector('#outputText');\n textOutput.className = \"flash\";\n }, 20);\n }\n else if (obj.type == \"warning\") {\n var textOutput = devEventOutput.querySelector('#outputText');\n textOutput.innerHTML += \"

\" + obj.message + \"

\";\n textOutput.scrollTop = textOutput.scrollHeight;\n BroadcastToLogger(obj.message);\n }\n else if (obj.type == \"error\") {\n var textOutput = devEventOutput.querySelector('#outputText');\n textOutput.innerHTML += \"

\" + obj.message + \"

\";\n textOutput.scrollTop = textOutput.scrollHeight;\n BroadcastToLogger(obj.message);\n\n }\n else {\n var textOutput = devEventOutput.querySelector('#outputText');\n textOutput.innerHTML += \"

\" + obj.message + \"

\";\n textOutput.scrollTop = textOutput.scrollHeight;\n BroadcastToLogger(obj.message);\n\n }\n }\n };\n\n export function CheckLogStatus(this: any): void {\n if (process.env.NODE_ENV === \"development\") {\n var useEventLog = localStorage.getItem(\"easyfyDevEventLog\") == \"true\";\n\n useEventLog ? this.EnableLog() : this.DisableLog();\n }\n };\n\n export function EnableLog(): void {\n if (process.env.NODE_ENV === \"development\") {\n localStorage.setItem(\"easyfyDevEventLog\", \"true\");\n var devEventOutput = document.querySelector(\"#devEventOutput\") as HTMLElement;\n if (devEventOutput) {\n devEventOutput.style.display = \"grid\";\n }\n }\n };\n\n export function DisableLog(): void {\n if (process.env.NODE_ENV === \"development\") {\n localStorage.setItem(\"easyfyDevEventLog\", \"false\");\n var devEventOutput = document.querySelector(\"#devEventOutput\") as HTMLElement;\n if (devEventOutput) {\n devEventOutput.style.display = \"none\";\n }\n }\n };\n\n export function ToggleImpressionVisualizer(): void {\n if (process.env.NODE_ENV === \"development\") {\n var date = new Date();\n date.setDate(date.getDate() + 30);\n var visualizerValue = localStorage.getItem(\"easyfyDevImpVisualizer\");\n var btn = document.querySelector(\"#toggleImpressionBtn\") as HTMLElement;\n\n if (visualizerValue == \"true\") {\n localStorage.setItem(\"easyfyDevImpVisualizer\", \"false\");\n btn.style.color = \"#c4c4c4\";\n\n document.querySelectorAll('.impressionSeen').forEach((elem) => {\n elem.classList.remove('impressionSeen');\n });\n }\n else {\n localStorage.setItem(\"easyfyDevImpVisualizer\", \"true\");\n btn.style.color = \"#ff7600\";\n document.querySelectorAll('[data-track-product][data-track-impression=\"True\"]').forEach((elem) => {\n elem.classList.add('impressionSeen');\n });\n }\n }\n };\n\n function ImpressionVisualizerIsOn(): boolean {\n var visualizerValue = localStorage.getItem(\"easyfyDevImpVisualizer\");\n if (visualizerValue == \"true\") {\n return true;\n }\n else {\n return false;\n }\n }\n\n export function PrintEventLayer(): void {\n if (process.env.NODE_ENV === \"development\") {\n\n var devEventLayerOutput = document.querySelector(\"#devEventLayerOutput\") as HTMLDivElement;\n if (!devEventLayerOutput) {\n var outputDiv = document.createElement('div');\n outputDiv.id = \"devEventLayerOutput\";\n outputDiv.style.position = \"fixed\";\n outputDiv.style.height = \"66%\";\n outputDiv.style.width = \"70%\";\n outputDiv.style.top = \"100px\";\n outputDiv.style.left = \"15%\";\n outputDiv.style.backgroundColor = \"#000000de\";\n outputDiv.style.color = \"#c4c4c4\";\n outputDiv.style.zIndex = \"2147483646\";\n outputDiv.style.borderRadius = \"5px\";\n outputDiv.style.boxShadow = \"1px 0px 14px 1px rgba(0,0,0,0.3)\";\n outputDiv.style.fontSize = \"11px\";\n outputDiv.style.overflow = \"auto\";\n\n var iconParagraph = document.createElement('p');\n iconParagraph.style.cursor = \"pointer\";\n iconParagraph.style.width = \"30px\";\n iconParagraph.style.height = \"30px\";\n iconParagraph.style.padding = \"0px 8px\";\n iconParagraph.style.lineHeight = \"30px\";\n iconParagraph.style.position = \"fixed\";\n iconParagraph.onclick = EasyfyEventLogger.HidePrintedEventLayer;\n iconParagraph.innerHTML = \"✖\";\n\n var textElement = document.createElement('div');\n textElement.id = \"devEventLayerOutputText\";\n textElement.style.padding = \"30px\";\n textElement.style.fontFamily = \"monospace\";\n textElement.style.whiteSpace = \"pre\";\n\n outputDiv.appendChild(iconParagraph);\n outputDiv.appendChild(textElement);\n\n\n document.querySelector('body').appendChild(outputDiv);\n devEventLayerOutput = document.querySelector(\"#devEventLayerOutput\") as HTMLDivElement;\n\n }\n\n devEventLayerOutput.style.display = \"block\";\n const brace = {\n brace: 0\n };\n\n var jsonstring = JSON.stringify(window.EasyfyEventLayer, null, 2);\n var outputElement = document.querySelector(\"#devEventLayerOutputText\") as HTMLDivElement;\n outputElement.innerHTML = \"

Event layer:

\" + jsonstring;\n //console.log(JSON.stringify(window.EasyfyEventLayer, null, 2));\n }\n };\n\n export function HidePrintedEventLayer(): void {\n if (process.env.NODE_ENV === \"development\") {\n var devEventLayerOutput = document.querySelector(\"#devEventLayerOutput\") as HTMLDivElement;\n if (devEventLayerOutput) {\n devEventLayerOutput.style.display = \"none\";\n }\n }\n };\n\n export function RunEventConsumer(): void {\n if (process.env.NODE_ENV === \"development\") {\n\n var debugDiv = document.createElement('div');\n debugDiv.id = \"debugEventConsumer\";\n debugDiv.style.padding = \"10px\";\n debugDiv.style.backgroundColor = \"#101010\";\n debugDiv.style.overflowY = \"auto\";\n debugDiv.style.height = \"100%\";\n debugDiv.style.width = \"100%\";\n debugDiv.style.position = \"fixed\";\n debugDiv.style.top = \"0\";\n debugDiv.style.left = \"0\";\n debugDiv.style.zIndex = \"2147483647\";\n debugDiv.style.color = \"#c5c5c5\";\n\n document.body.appendChild(debugDiv);\n\n document.body.style.overflowY = \"hidden\";\n\n _broadcastChannel.addEventListener(\"message\", (event) => {\n DisplayEventMessage(event.data);\n });\n }\n };\n\n export function DisplayEventMessage(data: object): void {\n if (process.env.NODE_ENV === \"development\") {\n let outputElement = document.querySelector('#debugEventConsumer');\n if (outputElement) {\n\n let jsonString = JSON.stringify(data);\n let highlightedJsonString = HighlightEventNameValue(jsonString);\n\n outputElement.innerHTML += '
' + GetCurrentTime() + ':
' + highlightedJsonString + '
';\n outputElement.scrollTop = outputElement.scrollHeight;\n }\n }\n }\n\n export function BroadcastToLogger(data: any): void {\n if (process.env.NODE_ENV === \"development\") {\n if (_broadcastChannel) {\n _broadcastChannel.postMessage(data);\n }\n }\n }\n function HighlightEventNameValue(jsonString: string): string {\n // Regular expression to find `\"eventName\":\"value\"`\n const regex = /\"eventName\":\"([^\"]+)\"/g;\n\n // Replace matched `\"eventName\":\"value\"` with `\"eventName\":\"value\"`\n const highlightedJsonString = jsonString.replace(regex, '\"eventName\":\"$1\"');\n\n return highlightedJsonString;\n }\n\n export function GetCurrentTime(): string {\n const now = new Date();\n\n const hours = (now.getHours() < 10 ? '0' : '') + now.getHours();\n const minutes = (now.getMinutes() < 10 ? '0' : '') + now.getMinutes();\n const seconds = (now.getSeconds() < 10 ? '0' : '') + now.getSeconds();\n const milliseconds = (now.getMilliseconds() < 10 ? '00' : (now.getMilliseconds() < 100 ? '0' : '')) + now.getMilliseconds();\n\n return `${hours}:${minutes}:${seconds}.${milliseconds}`;\n }\n}\n\n","import { IEasyfyEvent, IDataMapper, IEasyfyEventExporter } from '@shared/easyfy.events/easyfy.eventdata';\n\n/* Ga4 Exporter class */\nexport class Ga4EventExporter implements IEasyfyEventExporter {\n mapper: IDataMapper;\n WithMapper(mapper: IDataMapper): void {\n this.mapper = mapper;\n }\n\n RegisterEvent(event: IEasyfyEvent): Promise {\n return new Promise(async (resolve) => {\n if (!this.mapper) return;\n var eventData = this.mapper.MapEventData(event);\n await this.PushToDataLayer(eventData);\n resolve();\n })\n }\n\n async PushToDataLayer(ga4Event: any): Promise {\n return new Promise(async (resolve) => {\n if (ga4Event) {\n window['dataLayer'] = window['dataLayer'] || [];\n window['dataLayer'].push({ ecommerce: null });\n if (Array.isArray(ga4Event)) {\n window['dataLayer'].push(...ga4Event);\n } else {\n window['dataLayer'].push(ga4Event);\n }\n }\n resolve();\n })\n\n //console.group('%c GA DataLayer ', 'color: #bada55');\n //console.dir(window['dataLayer']);\n //console.groupEnd();\n }\n}","\nexport class FeatureNames {\n static EventTracking: string = \"eventtracking\";\n}\n\nexport class Features {\n static FeatureIsActive = (featureName: string): boolean => {\n var featureIsActiveForClient = document.querySelector('html').hasAttribute(featureName);\n return featureIsActiveForClient;\n }\n}\n\n\n\n","import { IEasyfyEvent, IDataMapper, IEasyfyEventExporter } from '@shared/easyfy.events/easyfy.eventdata';\n\n/* Klaviyo Exporter class */\nexport class KlaviyoEventExporter implements IEasyfyEventExporter {\n mapper: IDataMapper;\n WithMapper(mapper: IDataMapper): void {\n this.mapper = mapper;\n }\n\n RegisterEvent(event: IEasyfyEvent): Promise {\n return new Promise(async (resolve) => {\n if (this.mapper) {\n var eventData = this.mapper.MapEventData(event);\n\n if (eventData?.event && eventData?.data) {\n await this.PushToKlaviyo(eventData);\n }\n\n if (eventData?.identify) {\n await this.IdentifyUser(eventData.identify);\n }\n }\n resolve();\n });\n }\n\n async PushToKlaviyo(klaviyoEvent: any): Promise {\n return new Promise(async (resolve) => {\n if (klaviyoEvent) {\n window['klaviyo'] = window?.['klaviyo'] || [];\n window['klaviyo'].push([\"track\", klaviyoEvent.event, klaviyoEvent.data])\n\n //console.group('%c Klaviyo ', 'color: #bada55');\n //console.dir(window['klaviyo']);\n //console.groupEnd();\n resolve(true)\n }\n else {\n resolve(false);\n }\n });\n }\n async IdentifyUser(emailToRegister: any): Promise {\n return new Promise(async (resolve) => {\n if (emailToRegister) {\n window['klaviyo'] = window?.['klaviyo'] || [];\n window['klaviyo'].identify({\n 'email': emailToRegister\n });\n\n resolve(true)\n }\n else {\n resolve(false);\n }\n });\n }\n}","import { element } from '@shared/easyfy.core';\nimport { StatsEventExporter } from '@shared/easyfy.events/exporters/eventExporter.stats';\nimport { Ga4EventExporter } from '@shared/easyfy.events/exporters/eventExporter.ga4';\nimport { EasyfyEventData, IDataMapper, IEasyfyEvent, IEasyfyEventExporter, IWorkerJob, ITrackableElement, ISessionStarted, IClientEventMetaData, IWorkerMessage } from '@shared/easyfy.events/easyfy.eventdata';\nimport { EasyfyEventLogger } from '@shared/easyfy.events/easyfy.event.devlogger';\nimport { FeatureNames, Features } from '@webServices/features.service';\nimport { KlaviyoEventExporter } from './exporters/eventExporter.klaviyo';\n\nexport class ServiceNames {\n static Stats: string = \"stats\";\n static Ga4: string = \"ga4\";\n static Klaviyo: string = \"klaviyo\";\n}\nexport class EventNames {\n static PageView: string = \"pageview\";\n static ProductImpression: string = \"productimpression\";\n static ProductClick: string = \"productclick\";\n static ProductPageView: string = \"productpageview\";\n static BannerImpression = \"bannerimpression\";\n static BannerClick = \"bannerclick\";\n static ElementImpression = \"elementimpression\";\n static ElementClick = \"elementclick\";\n static AddToCart: string = \"addtocart\";\n static RemoveFromCart: string = \"removefromcart\";\n static QuantityChanged: string = \"quantitychanged\";\n static StartedCheckout: string = \"startedcheckout\";\n static CompletedCheckout: string = \"completedcheckout\";\n static SearchPerformed: string = \"searchperformed\";\n static ContinueToPayment: string = \"continuetopayment\";\n static SessionStarted: string = \"sessionstarted\";\n static LoggedIn: string = \"loggedin\";\n static LoggedOut: string = \"loggedout\";\n}\n\nexport class Message {\n static FetchClientMetaData = \"cmd_fetch_client_meta_data\";\n static BlockStatsApi = \"cmd_block_stats_api\";\n}\n\nexport class LocalStorageKeys {\n static SessionTimer = \"e_sessionTimer\";\n static SessionId = \"e_sessionId\";\n static ClientId = \"e_clientId\";\n static UserId = \"e_userId\";\n static LastCheckedUserId = \"e_lastCheckedUserId\";\n static IsTablet = \"e_tablet\";\n static IsMobilePhone = \"e_mobilephone\";\n static IsDekstop = \"e_desktop\";\n static UserIdCookieKey = \"e_userIdCookieKey\";\n static IPAddress = \"e_ipAddress\";\n static StatsIsBlocked = \"e_statsServiceBlocked\";\n static StatsEventsThresholdRemoved = \"e_StatsEventsTresholdRemoved\"\n static StatsEventsTransitionObj = \"e_statsEventsTransitionObj\"\n}\n\nnamespace Easyfy.Modules {\n\n export class EasyfyEventHandler {\n private eventExporters: Map = new Map();\n private observedElements: string[] = [];\n private intersectionObserver: IntersectionObserver;\n private bannerIntersectionObserver: IntersectionObserver;\n private mutationObserver: MutationObserver;\n public static instance: EasyfyEventHandler;\n private featureFlag: boolean;\n private initiated: boolean = false;\n\n constructor(eventMappers: Map) {\n EasyfyEventHandler.instance = this;\n EasyfyEventHandler.instance.featureFlag = Features.FeatureIsActive(FeatureNames.EventTracking);\n window.EasyfyEventLayerInstance = this;\n\n if (!EasyfyEventHandler.instance.featureFlag) return;\n\n EasyfyEventData.GetAllServices().forEach(service => {\n var eventExporter: IEasyfyEventExporter;\n switch (service.name.toLowerCase()) {\n case ServiceNames.Stats: {\n eventExporter = new StatsEventExporter();\n break;\n }\n case ServiceNames.Klaviyo: {\n eventExporter = new KlaviyoEventExporter();\n break;\n }\n case ServiceNames.Ga4: {\n eventExporter = new Ga4EventExporter();\n break;\n }\n }\n if (eventExporter) {\n eventExporter.WithMapper(eventMappers.get(service.name));\n this.eventExporters.set(service.name, eventExporter);\n }\n })\n\n EasyfyEventLogger.Log({\n type: \"updateeventlayerstatus\",\n });\n\n EasyfyEventHandler.CheckSessionStart().then(() => {\n EasyfyEventHandler.RunEvents().then(() => {\n if (EasyfyEventData.ShouldRegisterProductImpressions()) {\n EasyfyEventHandler.InitProductIntersectionObserver();\n EasyfyEventHandler.InitMutationObserver();\n }\n if (EasyfyEventData.ShouldRegisterBannerImpressions()) {\n EasyfyEventHandler.InitBannerIntersectionObserver();\n }\n EasyfyEventHandler.InitElementIntersectionObserver();\n window.addEventListener('click', EasyfyEventHandler.ClickEventChecker);\n EasyfyEventHandler.instance.initiated = true;\n });\n });\n };\n\n static async RunEvents(): Promise {\n return new Promise(async (resolve) => {\n var inlineScript = element('[data-container=\"easyfy-preload-tracking-events\"]');\n if (inlineScript) {\n inlineScript.remove();\n }\n\n if (!EasyfyEventData.HasEvents()) {\n resolve();\n return;\n }\n for await (const event of EasyfyEventData.Events()) {\n await EasyfyEventHandler.RunEvent(event);\n };\n\n EasyfyEventData.ClearEvents();\n resolve();\n });\n };\n\n static async CheckSessionStart(): Promise {\n return new Promise(async (resolve) => {\n if (EasyfyEventData.ServiceIsActive(ServiceNames.Stats) !== true) {\n resolve();\n return;\n }\n var sessionTimer = localStorage.getItem(LocalStorageKeys.SessionTimer);\n if (!sessionTimer) {\n localStorage.setItem(LocalStorageKeys.SessionTimer, new Date(Date.now()).toUTCString());\n sessionTimer = localStorage.getItem(LocalStorageKeys.SessionTimer);\n await EasyfyEventHandler.FetchClientMetaData();\n await EasyfyEventHandler.SendStartSessionEvent();\n resolve();\n }\n\n var checkTime = new Date(sessionTimer);\n var now = new Date(Date.now());\n\n var diff = (checkTime.getTime() - now.getTime()) / 1000;\n diff /= 60;\n var minutesBetween = Math.abs(Math.round(diff));\n\n if (minutesBetween >= 20) {\n var oldSessionId = localStorage.getItem(LocalStorageKeys.SessionId);\n await EasyfyEventHandler.FetchClientMetaData();\n var newSessionId = localStorage.getItem(LocalStorageKeys.SessionId);\n if (oldSessionId != newSessionId) {\n await EasyfyEventHandler.SendStartSessionEvent();\n }\n }\n\n localStorage.setItem(LocalStorageKeys.SessionTimer, new Date(Date.now()).toUTCString());\n\n resolve();\n });\n }\n\n static async FetchClientMetaData(): Promise {\n return new Promise(async (resolve) => {\n\n EasyfyEventData.SetStatsApiBlock(false);\n\n const response = await fetch(\"/api/stats/clientmetadata/\");\n\n if (!response.ok) {\n if (response.status == 428 || response.status == 404) {\n EasyfyEventData.SetStatsApiBlock(true);\n }\n\n localStorage.setItem(LocalStorageKeys.SessionId, null);\n localStorage.setItem(LocalStorageKeys.ClientId, null);\n localStorage.setItem(LocalStorageKeys.UserId, null);\n localStorage.setItem(LocalStorageKeys.IsDekstop, null);\n localStorage.setItem(LocalStorageKeys.IsMobilePhone, null);\n localStorage.setItem(LocalStorageKeys.IsTablet, null);\n localStorage.setItem(LocalStorageKeys.UserIdCookieKey, null);\n localStorage.setItem(LocalStorageKeys.IPAddress, null);\n\n resolve(false);\n return;\n }\n\n var clientMetaData = await response.json()\n\n localStorage.setItem(LocalStorageKeys.SessionId, clientMetaData.sessionId);\n localStorage.setItem(LocalStorageKeys.ClientId, clientMetaData.clientId);\n localStorage.setItem(LocalStorageKeys.UserId, clientMetaData.userId);\n localStorage.setItem(LocalStorageKeys.IsDekstop, clientMetaData.isDesktop);\n localStorage.setItem(LocalStorageKeys.IsMobilePhone, clientMetaData.isMobilePhone);\n localStorage.setItem(LocalStorageKeys.IsTablet, clientMetaData.isTablet);\n localStorage.setItem(LocalStorageKeys.UserIdCookieKey, clientMetaData.userIdCookieKey);\n localStorage.setItem(LocalStorageKeys.IPAddress, clientMetaData.ipAddress);\n\n\n var data: IClientEventMetaData = {\n ClientId: clientMetaData.clientId,\n SessionId: clientMetaData.sessionId,\n UserId: clientMetaData.userId,\n IsDesktop: clientMetaData.isDesktop,\n IsMobilePhone: clientMetaData.isMobilePhone,\n IsTablet: clientMetaData.isTablet,\n IPAddress: clientMetaData.ipAddress\n }\n resolve(true);\n });\n }\n\n static BlockStatsApi(): void {\n EasyfyEventData.SetStatsApiBlock(true);\n }\n\n static HandleWorkerMessage(message) {\n var typedMessage = message.data as IWorkerMessage\n switch (typedMessage.Message) {\n case Message.FetchClientMetaData: {\n EasyfyEventHandler.FetchClientMetaData()\n break;\n }\n case Message.BlockStatsApi: {\n EasyfyEventHandler.BlockStatsApi()\n break;\n }\n }\n }\n\n static SendStartSessionEvent(): Promise {\n return new Promise(async (resolve) => {\n var clientMetaData: IClientEventMetaData = EasyfyEventData.GetClientEventMetaData();\n var clientData: ISessionStarted = {\n Culture: \"not-set-yet\", //todo -> ? \n Currency: EasyfyEventData.SiteInfo().currencyCode,\n IsDesktop: clientMetaData.IsDesktop,\n IsMobilePhone: clientMetaData.IsMobilePhone,\n IsTablet: clientMetaData.IsTablet,\n RecurringUser: EasyfyEventData.IsRecurringUser(true),\n Referrer: document.referrer,\n Path: window.location.pathname,\n UserAgent: window.navigator.userAgent,\n ClientId: clientMetaData.ClientId,\n SessionId: clientMetaData.SessionId,\n UserId: clientMetaData.UserId,\n VisitorId: clientMetaData.UserId\n };\n\n var sessionStartedEvent: IEasyfyEvent = {\n eventName: EventNames.SessionStarted,\n data: clientData\n };\n\n await EasyfyEventHandler.RunEvent(sessionStartedEvent);\n resolve();\n });\n }\n\n static InitMutationObserver(): void {\n let options = {\n childList: true,\n subtree: true,\n attributes: false,\n characterData: false\n };\n\n let targets = document.querySelectorAll('[data-track-list], [data-container=\"search-result\"]');\n EasyfyEventHandler.instance.mutationObserver = new MutationObserver(this.ElementMutated);\n targets.forEach(target => EasyfyEventHandler.instance.mutationObserver.observe(target, options));\n }\n\n static ElementMutated(mutations: MutationRecord[]) {\n mutations.forEach(mutation => {\n EasyfyEventHandler.RebindObserveProducts();\n });\n }\n\n static BannerElementMutated(mutations: MutationRecord[]) {\n mutations.forEach(mutation => {\n EasyfyEventHandler.RebindObserveBanners();\n });\n }\n\n static InitProductIntersectionObserver(): void {\n let options = {\n root: null,\n rootMargin: '0px',\n threshold: 0.1\n };\n EasyfyEventHandler.instance.intersectionObserver = new IntersectionObserver(this.ProductCardObserved, options);\n let targets = document.querySelectorAll('[data-track-product]');\n targets.forEach(target => EasyfyEventHandler.instance.intersectionObserver.observe(target));\n }\n\n static InitBannerIntersectionObserver(): void {\n let options = {\n root: null,\n rootMargin: '0px',\n threshold: 0.1\n };\n EasyfyEventHandler.instance.bannerIntersectionObserver = new IntersectionObserver(this.BannerElementObserved, options);\n let bannerTargets = document.querySelectorAll('[data-track-banner]');\n bannerTargets.forEach(target => EasyfyEventHandler.instance.bannerIntersectionObserver.observe(target));\n }\n\n static InitElementIntersectionObserver(): void {\n let options = {\n root: null,\n rootMargin: '0px',\n threshold: 0.1\n };\n EasyfyEventHandler.instance.bannerIntersectionObserver = new IntersectionObserver(this.TrackableElementObserved, options);\n let bannerTargets = document.querySelectorAll('[data-track-element]');\n bannerTargets.forEach(target => EasyfyEventHandler.instance.bannerIntersectionObserver.observe(target));\n }\n\n static RebindObserveProducts() {\n EasyfyEventHandler.instance.intersectionObserver.disconnect();\n let targets = document.querySelectorAll('[data-track-product]');\n targets.forEach(target => EasyfyEventHandler.instance.intersectionObserver.observe(target));\n }\n\n static RebindObserveBanners() {\n EasyfyEventHandler.instance.bannerIntersectionObserver.disconnect();\n let targets = document.querySelectorAll('[data-track-banner]');\n targets.forEach(target => EasyfyEventHandler.instance.bannerIntersectionObserver.observe(target));\n }\n\n static ProductCardObserved(entries: IntersectionObserverEntry[], observer: any) {\n var eventProductIds: string[] = [];\n var eventProductSalesUnitCodes: string[] = [];\n var listIds: string[] = [];\n var promotedProducts: boolean[] = [];\n\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n EasyfyEventHandler.instance.intersectionObserver.unobserve(entry.target);\n var elementIsRegisteredForImpression = entry.target.getAttribute(\"data-track-impression\").toLowerCase() === 'true';\n if (!elementIsRegisteredForImpression) return;\n\n // points to a product but could appear multiple times on a page\n var productIdentifier = entry.target.getAttribute(\"data-product-event-id\");\n // id of product card element, always unique\n var elementIdentifier = entry.target.getAttribute(\"data-element-event-id\");\n var defaultSalesUnitCode = entry.target.getAttribute(\"data-default-sales-unit-code\");\n var isPromotedProduct = entry.target.getAttribute(\"data-event-property-is-promotion\")?.toLowerCase() === 'true';\n\n if (productIdentifier && elementIdentifier) {\n if (!EasyfyEventHandler.instance.observedElements.includes(elementIdentifier)) {\n EasyfyEventHandler.instance.observedElements.push(elementIdentifier);\n EasyfyEventLogger.Log({\n type: \"productimpression\",\n message: (`Product '${productIdentifier}' with SalesCodeUnit '${defaultSalesUnitCode}' seen`),\n target: entry.target\n });\n eventProductIds.push(productIdentifier);\n eventProductSalesUnitCodes.push(defaultSalesUnitCode);\n promotedProducts.push(isPromotedProduct);\n var node = entry.target;\n while (true) {\n node = node.parentElement;\n if (node.hasAttribute(\"data-track-list\")) {\n let listId = node.getAttribute(\"data-list-name\");\n if (listId) {\n listIds.push(listId);\n break;\n }\n }\n else if (node.nodeName == 'BODY') {\n listIds.push(null);\n break;\n }\n }\n }\n }\n else {\n EasyfyEventLogger.Log({\n type: \"error\",\n message: \"Product impression failed: missing event product ID\"\n });\n }\n }\n });\n\n if (eventProductIds.length > 0) {\n let event: IEasyfyEvent = {\n eventName: EventNames.ProductImpression,\n data: {\n productIdentifiers: eventProductIds,\n salesUnitCodes: eventProductSalesUnitCodes,\n listIds: listIds,\n promotedProducts\n }\n }\n EasyfyEventHandler.RunEvent(event);\n }\n }\n\n static BannerElementObserved(entries: IntersectionObserverEntry[], observer: any) {\n var bannerIds: string[] = [];\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n EasyfyEventHandler.instance.bannerIntersectionObserver.unobserve(entry.target);\n var elementIsRegisteredForImpression = entry.target.getAttribute(\"data-track-impression\").toLowerCase() === 'true';\n if (!elementIsRegisteredForImpression) return;\n var bannerIdentifier = entry.target.getAttribute(\"data-banner-event-id\");\n if (bannerIdentifier) {\n if (!EasyfyEventHandler.instance.observedElements.includes(bannerIdentifier)) {\n EasyfyEventHandler.instance.observedElements.push(bannerIdentifier);\n EasyfyEventLogger.Log({\n type: \"bannerimpression\",\n message: (\"Banner '\" + bannerIdentifier + \"' seen\")\n });\n bannerIds.push(bannerIdentifier);\n }\n }\n else {\n EasyfyEventLogger.Log({\n type: \"error\",\n message: \"Banner impression failed: missing event banner ID\"\n });\n }\n }\n });\n\n if (bannerIds.length > 0) {\n bannerIds.forEach(id => {\n let event: IEasyfyEvent = {\n eventName: EventNames.BannerImpression,\n data: { bannerIdentifier: id }\n }\n EasyfyEventHandler.RunEvent(event);\n });\n }\n }\n\n static TrackableElementObserved(entries: IntersectionObserverEntry[], observer: any) {\n var elements: ITrackableElement[] = [];\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n var elementIsRegisteredForImpression = entry.target.getAttribute(\"data-track-impression\")?.toLowerCase() === 'true';\n if (!elementIsRegisteredForImpression) return;\n\n var elementIdentifier = entry.target.getAttribute(\"data-event-id\");\n if (elementIdentifier) {\n var multiObserve = entry.target.getAttribute(\"data-multi-observe\").toLowerCase() === 'true';\n if (multiObserve == false) {\n EasyfyEventHandler.instance.bannerIntersectionObserver.unobserve(entry.target);\n if (!EasyfyEventHandler.instance.observedElements.includes(elementIdentifier)) {\n EasyfyEventHandler.instance.observedElements.push(elementIdentifier);\n }\n }\n\n var trackType = entry.target.getAttribute(\"data-track-type\");\n var properties = new Map();\n\n for (const attribute of entry.target.getAttributeNames()) {\n if (attribute.startsWith(\"data-event-property-\")) {\n const value = entry.target.getAttribute(attribute);\n var key = attribute.replace(\"data-event-property-\", \"\");\n properties.set(key, value);\n }\n }\n\n elements.push({\n Id: elementIdentifier,\n Type: trackType,\n Properties: properties\n });\n\n EasyfyEventLogger.Log({\n type: \"elementimpression\",\n message: (\"Element '\" + elementIdentifier + \"' seen\")\n });\n\n }\n else {\n EasyfyEventLogger.Log({\n type: \"error\",\n message: \"Element impression failed: missing event ID on element\"\n });\n }\n }\n });\n\n if (elements.length > 0) {\n elements.forEach(element => {\n let event: IEasyfyEvent = {\n eventName: EventNames.ElementImpression,\n data: element\n }\n EasyfyEventHandler.RunEvent(event);\n });\n }\n }\n\n static ClickEventChecker(event: any) {\n if (event.target.closest('A') != null) {\n var node = event.target.closest('A');\n var targetUrl = node.href;\n if (node.closest('[data-track-product]') != null) {\n EasyfyEventHandler.ClickEventProduct(event, node, targetUrl);\n return;\n }\n else if (node.closest('[data-track-banner]') != null) {\n EasyfyEventHandler.ClickEventBanner(event, node, targetUrl);\n return;\n }\n else if (node.closest('[data-track-element]') != null) {\n EasyfyEventHandler.ClickEventElement(event, node, targetUrl);\n return;\n }\n }\n else {\n var node = event.target;\n if (node.closest('[data-track-element]') != null) {\n EasyfyEventHandler.ClickEventElement(event, node);\n return;\n }\n }\n }\n\n static ClickEventProduct(event: any, node: any, targetUrl: any) {\n node = node.closest('[data-track-product]');\n var elementIsRegisteredForClick = node.getAttribute(\"data-track-click\").toLowerCase() === 'true';\n if (elementIsRegisteredForClick) {\n event.stopPropagation();\n event.preventDefault();\n\n var defaultSalesUnitCode = node.getAttribute(\"data-default-sales-unit-code\");\n var productId = node.getAttribute('data-product-event-id');\n var isPromotedProduct = node.getAttribute(\"data-event-property-is-promotion\")?.toLowerCase() === 'true';\n\n if (productId) {\n var listName\n while (true) {\n node = node.parentElement;\n if (!node) {\n break;\n }\n if (node.hasAttribute(\"data-track-list\")) {\n listName = node.getAttribute(\"data-list-name\");\n break;\n }\n else if (node.nodeName == 'body') {\n listName = null;\n break;\n }\n }\n\n let event: IEasyfyEvent = {\n eventName: EventNames.ProductClick,\n data: {\n productIdentifier: productId,\n salesUnitCode: defaultSalesUnitCode,\n listName: listName,\n isPromotedProduct: isPromotedProduct\n }\n }\n EasyfyEventHandler.RunEvent(event);\n window.location = targetUrl;\n }\n else {\n //Don't block links\n window.location = targetUrl;\n }\n }\n }\n\n static ClickEventBanner(event: any, node: any, targetUrl: any) {\n node = node.closest('[data-track-banner]');\n var elementIsRegisteredForClick = node.getAttribute(\"data-track-click\").toLowerCase() === 'true';\n if (elementIsRegisteredForClick) {\n event.stopPropagation();\n event.preventDefault();\n\n var bannerId = node.getAttribute('data-banner-event-id');\n if (bannerId) {\n let event: IEasyfyEvent = {\n eventName: EventNames.BannerClick,\n data: {\n bannerIdentifier: bannerId,\n }\n }\n EasyfyEventHandler.RunEvent(event);\n window.location = targetUrl;\n }\n else {\n //Don't block links\n window.location = targetUrl;\n }\n }\n }\n\n static ClickEventElement(event: any, node: any, targetUrl?: any) {\n node = node.closest('[data-track-element]');\n var elementIsRegisteredForClick = node.getAttribute(\"data-track-click\")?.toLowerCase() === 'true' ?? false;\n if (elementIsRegisteredForClick) {\n\n if (targetUrl) {\n event.stopPropagation();\n event.preventDefault();\n }\n\n var elementId = node.getAttribute('data-event-id');\n\n if (elementId) {\n var trackType = node.getAttribute('data-track-type');\n var properties = new Map();\n\n for (const attribute of node.getAttributeNames()) {\n if (attribute.startsWith(\"data-event-property-\")) {\n const value = node.getAttribute(attribute);\n var key = attribute.replace(\"data-event-property-\", \"\");\n properties.set(key, value);\n }\n }\n\n var data: ITrackableElement = {\n Id: elementId,\n Type: trackType,\n Properties: properties\n }\n\n let event: IEasyfyEvent = {\n eventName: EventNames.ElementClick,\n data\n }\n\n EasyfyEventHandler.RunEvent(event);\n\n const singleClick = node.dataset['singleClick'];\n if (singleClick) node.removeAttribute('data-track-element');\n\n if (targetUrl) {\n window.location = targetUrl;\n }\n }\n else if (targetUrl) {\n //Don't block links\n window.location = targetUrl;\n }\n }\n }\n\n static GetCurrentInstance(): EasyfyEventHandler {\n var instance: EasyfyEventHandler;\n if (EasyfyEventHandler.instance) {\n instance = EasyfyEventHandler.instance\n }\n else if (window.EasyfyEventLayerInstance) {\n instance = window.EasyfyEventLayerInstance as EasyfyEventHandler;\n }\n\n return instance;\n }\n\n static RunEvent(event: IEasyfyEvent): Promise {\n return new Promise(async (resolve) => {\n var dispatchedToServices = [];\n var errors = new Map();\n for await (const service of EasyfyEventData.GetAllServices()) {\n if (EasyfyEventData.ConsumesEvent(service.name, event.eventName)) {\n try {\n var instance = EasyfyEventHandler.GetCurrentInstance();\n\n await instance.eventExporters.get(service.name)?.RegisterEvent(event);\n dispatchedToServices.push(service.name);\n\n }\n catch (error) {\n errors.set(service.name, event.eventName);\n console.warn(error);\n }\n }\n };\n\n EasyfyEventLogger.BroadcastToLogger(event);\n\n if (dispatchedToServices.length > 0) {\n EasyfyEventLogger.Log({ type: \"event\", message: `Event '${event.eventName}' dispatched to: ${dispatchedToServices.join(', ')}` });\n } else {\n EasyfyEventLogger.Log({ type: \"event\", message: `Event '${event.eventName}' fired but not dispatched to any services` });\n }\n errors.forEach((value, key) => {\n EasyfyEventLogger.Log({ type: \"error\", message: `Error when trying to dispatch event '${value}' to: ${key}` });\n });\n\n resolve();\n });\n }\n\n static async RegisterResponseData(responseData: any): Promise {\n return new Promise(async (resolve) => {\n var instance = EasyfyEventHandler.GetCurrentInstance();\n if (instance?.initiated) {\n await EasyfyEventHandler.CheckSessionStart();\n if (responseData?.data?.eventLayer) {\n EasyfyEventLogger.Log({\n message: \"Event layer data added from response\",\n });\n\n EasyfyEventData.AddDataToEventLayer(responseData.data.eventLayer);\n\n EasyfyEventLogger.Log({\n type: \"updateeventlayerstatus\",\n });\n await EasyfyEventHandler.RunEvents();\n }\n }\n resolve();\n });\n }\n\n static GetCookie(cookieName) {\n let cookie = {};\n document.cookie.split(';').forEach(function (el) {\n let [key, value] = el.split('=');\n cookie[key.trim()] = value;\n })\n return cookie[cookieName];\n }\n\n }\n}\n\nexport default Easyfy.Modules;\n","import { EasyfyEventData, IBasketRow, IDataMapper, IEasyfyEvent, IProductData, ITrackableElement } from '@shared/easyfy.events/easyfy.eventdata';\nimport { EventNames } from '@shared/easyfy.events/easyfy.eventhandler';\n\nclass HayppGa4Product implements IProductData {\n Id: any;\n Ean: any;\n DisplayName: any;\n Brand: any;\n Categories: any[];\n Price: number;\n PriceExVat: number;\n CampaignCode: string;\n Flavour: string;\n Format: string;\n ProductType: string;\n DomainId: string;\n AbsoluteProductUrl: string;\n RelativeProductUrl: string;\n ProductImageUrl: string;\n}\n\nexport const Ga4_CustomData_ShippingCode: string = 'ga4_shipping_code';\n\nexport interface HayppGa4Shipping {\n Code: string;\n}\n\n/* Exporter class */\nexport class Ga4DataMapper implements IDataMapper {\n MapEventData(event: IEasyfyEvent): any {\n let mappedEvent: any;\n\n switch (event.eventName.toLowerCase()) {\n case EventNames.ProductImpression: {\n mappedEvent = this.ViewItemListEvent(event);\n break;\n }\n case EventNames.ProductClick: {\n mappedEvent = this.SelectItemEvent(event);\n break;\n }\n case EventNames.ProductPageView: {\n mappedEvent = this.ViewItemEvent(event);\n break;\n }\n case EventNames.BannerImpression: {\n mappedEvent = this.ViewPromotionEvent(event);\n break;\n }\n case EventNames.BannerClick: {\n mappedEvent = this.SelectBannerPromotionEvent(event);\n break;\n }\n case EventNames.AddToCart: {\n mappedEvent = this.AddToCartEvent(event);\n break;\n }\n case EventNames.RemoveFromCart: {\n mappedEvent = this.RemoveFromCartEvent(event);\n break;\n }\n case EventNames.StartedCheckout: {\n mappedEvent = this.StartedCheckoutEvent(event);\n break;\n }\n case EventNames.ContinueToPayment: {\n mappedEvent = this.ContinueToPaymentEvent(event);\n break;\n }\n case EventNames.CompletedCheckout: {\n mappedEvent = this.CompletedCheckoutEvent(event);\n break;\n }\n case EventNames.ElementImpression: {\n if ((event.data as ITrackableElement).Type == 'mini-basket') {\n mappedEvent = this.ViewCartEvent(event);\n }\n break;\n }\n case EventNames.ElementClick: {\n if ((event.data as ITrackableElement).Type == 'consent-expansion') {\n mappedEvent = this.ExpandConsentEvent(event);\n }\n break;\n }\n }\n\n return mappedEvent;\n }\n\n ViewItemListEvent(event: IEasyfyEvent): any {\n if (!event.data.productIdentifiers) throw new Error('Product identifiers missing');\n if (!event.data.salesUnitCodes) throw new Error('Product sales unit codes missing');\n if (event.data.salesUnitCodes.length != event.data.productIdentifiers.length) throw new Error('Product sales unit codes and identifiers count missmatch');\n const priceIds: string[] = [];\n const siteInfo = EasyfyEventData.SiteInfo();\n const viewedProductItems: any[] = [];\n const promotedProductEvents: any[] = [];\n\n for (let i = 0; i < event.data.productIdentifiers.length; i++) {\n priceIds.push(event.data.productIdentifiers[i] + '-' + event.data.salesUnitCodes[i]);\n }\n\n const eventProducts = EasyfyEventData.Products(event.data.productIdentifiers);\n const eventPrices = EasyfyEventData.ProductSalesUnitPrices(priceIds);\n\n for (let i = 0; i < eventProducts.length; i++) {\n const product = eventProducts[i];\n const salesUnitPrice = eventPrices[i];\n\n const index = eventProducts.indexOf(product);\n const productListIndex = EasyfyEventData.ProductIndexInList(event.data.listIds[index], product.Id) + 1;\n\n let eventData = {\n discount: null,\n variant: null,\n coupon: null,\n price: salesUnitPrice?.priceExVat,\n index: productListIndex,\n item_list_name: event.data.listIds[index],\n item_variant: null,\n item_id: product.Id,\n item_name: product.DisplayName,\n item_brand: product.Brand,\n item_category: product.Categories.length > 0 ? product.Categories[0] : null,\n item_category2: product.Categories.length > 1 ? product.Categories[1] : null,\n item_category3: product.Categories.length > 2 ? product.Categories[2] : null,\n item_category4: product.Categories.length > 3 ? product.Categories[3] : null,\n item_category5: product.Categories.length > 4 ? product.Categories[4] : null,\n quantity: 1,\n cd_flavour: product.Flavour,\n cd_format: product.Format,\n cd_product_type: product.ProductType,\n cd_packsize: salesUnitPrice?.packSize,\n };\n\n viewedProductItems.push(eventData);\n\n if (event.data.promotedProducts[i]) {\n promotedProductEvents.push(eventData);\n }\n }\n\n const gaEvent = {\n event: 'view_item_list',\n ecommerce: {\n currency: siteInfo.currencyCode,\n items: viewedProductItems,\n cd_timestamp: this.GetTimeStamp(),\n },\n };\n\n // if any product is \"promoted\" - also send separate view_promotion event\n if (promotedProductEvents.length > 0) {\n const gaPromotedEvent = {\n event: 'view_promotion',\n ecommerce: {\n currency: siteInfo.currencyCode,\n items: promotedProductEvents,\n cd_timestamp: this.GetTimeStamp(),\n },\n };\n\n return [gaEvent, gaPromotedEvent];\n } else {\n return gaEvent;\n }\n }\n\n SelectItemEvent(event: IEasyfyEvent): any {\n if (!event.data.productIdentifier) throw new Error('Product identifier missing');\n\n const product = EasyfyEventData.Product(event.data.productIdentifier);\n const salesUnitPrice = EasyfyEventData.ProductSalesUnitPrice(event.data.productIdentifier + '-' + event.data.salesUnitCode);\n const productListIndex = EasyfyEventData.ProductIndexInList(event.data.listName, product.Id);\n const siteInfo = EasyfyEventData.SiteInfo();\n const ga4item: any[] = [];\n\n ga4item.push({\n discount: null,\n variant: null,\n coupon: null,\n price: salesUnitPrice?.priceExVat,\n index: productListIndex + 1,\n item_list_name: event.data.listName,\n item_variant: null,\n item_id: product.Id,\n item_name: product.DisplayName,\n item_brand: product.Brand,\n item_category: product.Categories.length > 0 ? product.Categories[0] : null,\n item_category2: product.Categories.length > 1 ? product.Categories[1] : null,\n item_category3: product.Categories.length > 2 ? product.Categories[2] : null,\n item_category4: product.Categories.length > 3 ? product.Categories[3] : null,\n item_category5: product.Categories.length > 4 ? product.Categories[4] : null,\n quantity: 1,\n cd_flavour: product.Flavour,\n cd_format: product.Format,\n cd_product_type: product.ProductType,\n cd_packsize: salesUnitPrice?.packSize,\n });\n\n const gaEvent = {\n event: 'select_item',\n ecommerce: {\n currency: siteInfo.currencyCode,\n items: ga4item,\n cd_timestamp: this.GetTimeStamp(),\n },\n };\n\n // if product is \"promoted\" - also send separate select_promotion event\n if (event.data.isPromotedProduct) {\n const promotedClickEvent = {\n event: 'select_promotion',\n ecommerce: {\n currency: siteInfo.currencyCode,\n items: ga4item,\n cd_timestamp: this.GetTimeStamp(),\n },\n };\n\n return [gaEvent, promotedClickEvent];\n } else {\n return gaEvent;\n }\n }\n\n ViewItemEvent(event: IEasyfyEvent): any {\n if (!event.data.productIdentifier) throw new Error('Product identifier missing');\n\n const product = EasyfyEventData.Product(event.data.productIdentifier);\n const salesUnitPrice = EasyfyEventData.ProductSalesUnitPrice(event.data.productIdentifier + '-' + event.data.salesUnitCode);\n\n const siteInfo = EasyfyEventData.SiteInfo();\n const ga4items: any[] = [];\n\n ga4items.push({\n discount: null,\n variant: null,\n coupon: null,\n price: salesUnitPrice?.priceExVat,\n index: null,\n item_list_id: null,\n item_list_name: null,\n item_variant: null,\n item_id: product.Id,\n item_name: product.DisplayName,\n item_brand: product.Brand,\n item_category: product.Categories.length > 0 ? product.Categories[0] : null,\n item_category2: product.Categories.length > 1 ? product.Categories[1] : null,\n item_category3: product.Categories.length > 2 ? product.Categories[2] : null,\n item_category4: product.Categories.length > 3 ? product.Categories[3] : null,\n item_category5: product.Categories.length > 4 ? product.Categories[4] : null,\n quantity: 1,\n cd_flavour: product.Flavour,\n cd_format: product.Format,\n cd_product_type: product.ProductType,\n cd_packsize: salesUnitPrice?.packSize,\n });\n\n const gaEvent = {\n event: 'view_item',\n ecommerce: {\n currency: siteInfo.currencyCode,\n value: salesUnitPrice?.priceExVat,\n items: ga4items,\n cd_timestamp: this.GetTimeStamp(),\n },\n };\n\n return gaEvent;\n }\n ViewPromotionEvent(event: IEasyfyEvent): any {\n if (!event.data.bannerIdentifier) throw new Error('Banner identifier missing');\n\n const banner = EasyfyEventData.Banner(event.data.bannerIdentifier);\n const ga4items: any[] = [];\n\n ga4items.push({\n promotion_id: banner.Id,\n promotion_name: banner.DisplayName,\n quantity: 1,\n cd_linkUrl: banner.LinkUrl,\n cd_pageUrl: banner.PageUrl,\n creative_name: null,\n creative_slot: null,\n discount: null,\n coupon: null,\n price: null,\n item_list_name: null,\n item_variant: null,\n item_id: null,\n item_name: null,\n item_brand: null,\n item_category: null,\n item_category2: null,\n item_category3: null,\n item_category4: null,\n item_category5: null,\n });\n\n const gaEvent = {\n event: 'view_promotion',\n ecommerce: {\n items: ga4items,\n cd_timestamp: this.GetTimeStamp(),\n },\n };\n\n return gaEvent;\n }\n\n SelectBannerPromotionEvent(event: IEasyfyEvent): any {\n if (!event.data.bannerIdentifier) throw new Error('Banner identifier missing');\n\n const banner = EasyfyEventData.Banner(event.data.bannerIdentifier);\n const ga4items: any[] = [];\n\n ga4items.push({\n promotion_id: banner.Id,\n promotion_name: banner.DisplayName,\n quantity: 1,\n cd_linkUrl: banner.LinkUrl,\n cd_pageUrl: banner.PageUrl,\n creative_name: null,\n creative_slot: null,\n discount: null,\n coupon: null,\n price: null,\n item_list_name: null,\n item_variant: null,\n item_id: null,\n item_name: null,\n item_brand: null,\n item_category: null,\n item_category2: null,\n item_category3: null,\n item_category4: null,\n item_category5: null,\n });\n\n const gaEvent = {\n event: 'select_promotion',\n ecommerce: {\n items: ga4items,\n cd_timestamp: this.GetTimeStamp(),\n },\n };\n\n return gaEvent;\n }\n\n AddToCartEvent(event: IEasyfyEvent): any {\n if (!event.data.productIdentifier) throw new Error('Product identifier missing');\n\n const product = EasyfyEventData.Product(event.data.productIdentifier);\n const salesUnitPrice = EasyfyEventData.ProductSalesUnitPrice(event.data.productIdentifier + '-' + event.data.salesUnitCode);\n\n const siteInfo = EasyfyEventData.SiteInfo();\n const ga4items: any[] = [];\n\n let listId = this.ListId(event.data.listName, event.data.listId);\n\n ga4items.push({\n discount: null,\n variant: null,\n coupon: null,\n price: salesUnitPrice?.priceExVat,\n index: null,\n item_list_name: event.data.listName,\n item_list_id: listId,\n item_variant: null,\n item_id: product.Id,\n item_name: product.DisplayName,\n item_brand: product.Brand,\n item_category: product.Categories.length > 0 ? product.Categories[0] : null,\n item_category2: product.Categories.length > 1 ? product.Categories[1] : null,\n item_category3: product.Categories.length > 2 ? product.Categories[2] : null,\n item_category4: product.Categories.length > 3 ? product.Categories[3] : null,\n item_category5: product.Categories.length > 4 ? product.Categories[4] : null,\n quantity: event.data.quantity,\n cd_flavour: product.Flavour,\n cd_format: product.Format,\n cd_product_type: product.ProductType,\n cd_packsize: salesUnitPrice?.packSize,\n cd_add: event.data.listName,\n });\n\n const gaEvent = {\n event: 'add_to_cart',\n ecommerce: {\n currency: siteInfo.currencyCode,\n value: salesUnitPrice?.priceExVat * event.data.quantity,\n items: ga4items,\n cd_timestamp: this.GetTimeStamp(),\n },\n };\n\n return gaEvent;\n }\n\n RemoveFromCartEvent(event: IEasyfyEvent): any {\n if (!event.data.productIdentifier) throw new Error('Product identifier missing');\n\n const product = EasyfyEventData.Product(event.data.productIdentifier);\n const salesUnitPrice = EasyfyEventData.ProductSalesUnitPrice(event.data.productIdentifier + '-' + event.data.salesUnitCode);\n const siteInfo = EasyfyEventData.SiteInfo();\n const ga4items: any[] = [];\n\n ga4items.push({\n discount: null,\n variant: null,\n coupon: null,\n price: salesUnitPrice?.priceExVat,\n index: null,\n item_list_name: event.data.listName,\n item_variant: null,\n item_id: product.Id,\n item_name: product.DisplayName,\n item_brand: product.Brand,\n item_category: product.Categories.length > 0 ? product.Categories[0] : null,\n item_category2: product.Categories.length > 1 ? product.Categories[1] : null,\n item_category3: product.Categories.length > 2 ? product.Categories[2] : null,\n item_category4: product.Categories.length > 3 ? product.Categories[3] : null,\n item_category5: product.Categories.length > 4 ? product.Categories[4] : null,\n quantity: event.data.quantity,\n cd_flavour: product.Flavour,\n cd_format: product.Format,\n cd_product_type: product.ProductType,\n cd_packsize: salesUnitPrice?.packSize,\n });\n\n const gaEvent = {\n event: 'remove_from_cart',\n ecommerce: {\n currency: siteInfo.currencyCode,\n value: salesUnitPrice?.priceExVat * event.data.quantity,\n items: ga4items,\n cd_timestamp: this.GetTimeStamp(),\n },\n };\n\n return gaEvent;\n }\n\n StartedCheckoutEvent(event: IEasyfyEvent): any {\n if (!event.data.checkoutProducts || event.data.checkoutProducts.length == 0) throw new Error('No products found');\n const ga4items: any[] = [];\n const siteInfo = EasyfyEventData.SiteInfo();\n let value: number = 0;\n\n event.data.checkoutProducts.forEach((checkoutProduct) => {\n const product = EasyfyEventData.Product(checkoutProduct.productIdentifier);\n const salesUnitPrice = EasyfyEventData.ProductSalesUnitPrice(checkoutProduct.productIdentifier + '-' + checkoutProduct.salesUnitCode);\n\n ga4items.push({\n discount: null,\n variant: null,\n coupon: null,\n price: salesUnitPrice?.priceExVat,\n index: null,\n item_list_name: event.data.listName,\n item_variant: null,\n item_id: product.Id,\n item_name: product.DisplayName,\n item_brand: product.Brand,\n item_category: product.Categories.length > 0 ? product.Categories[0] : null,\n item_category2: product.Categories.length > 1 ? product.Categories[1] : null,\n item_category3: product.Categories.length > 2 ? product.Categories[2] : null,\n item_category4: product.Categories.length > 3 ? product.Categories[3] : null,\n item_category5: product.Categories.length > 4 ? product.Categories[4] : null,\n quantity: checkoutProduct.qty,\n cd_flavour: product.Flavour,\n cd_format: product.Format,\n cd_product_type: product.ProductType,\n cd_packsize: salesUnitPrice?.packSize,\n });\n\n value += salesUnitPrice?.priceExVat * checkoutProduct.qty;\n });\n\n const gaEvent = {\n event: 'begin_checkout',\n ecommerce: {\n currency: siteInfo.currencyCode,\n value: value,\n items: ga4items,\n cd_timestamp: this.GetTimeStamp(),\n },\n };\n\n return gaEvent;\n }\n\n ContinueToPaymentEvent(event: IEasyfyEvent): any {\n if (!event.data.checkoutProducts || event.data.checkoutProducts.length == 0) {\n throw new Error('No products found');\n }\n const ga4items: any[] = [];\n const siteInfo = EasyfyEventData.SiteInfo();\n const shippingTier = EasyfyEventData.GetCustomData(Ga4_CustomData_ShippingCode);\n\n event.data.checkoutProducts.forEach((checkoutProduct) => {\n const product = EasyfyEventData.Product(checkoutProduct.productIdentifier);\n const salesUnitPrice = EasyfyEventData.ProductSalesUnitPrice(checkoutProduct.productIdentifier + '-' + checkoutProduct.salesUnitCode);\n\n ga4items.push({\n discount: null,\n variant: null,\n coupon: null,\n price: salesUnitPrice?.priceExVat,\n index: null,\n item_list_name: null,\n item_variant: null,\n item_id: product.Id,\n item_name: product.DisplayName,\n item_brand: product.Brand,\n item_category: product.Categories.length > 0 ? product.Categories[0] : null,\n item_category2: product.Categories.length > 1 ? product.Categories[1] : null,\n item_category3: product.Categories.length > 2 ? product.Categories[2] : null,\n item_category4: product.Categories.length > 3 ? product.Categories[3] : null,\n item_category5: product.Categories.length > 4 ? product.Categories[4] : null,\n quantity: checkoutProduct.qty,\n cd_campaign_code: product.CampaignCode,\n cd_flavour: product.Flavour,\n cd_format: product.Format,\n cd_product_type: product.ProductType,\n cd_packsize: salesUnitPrice?.packSize,\n });\n });\n\n const gaEvent = {\n event: 'add_shipping_info',\n ecommerce: {\n currency: siteInfo.currencyCode,\n items: ga4items,\n shipping_tier: shippingTier?.Code ?? 'Not-set',\n cd_timestamp: this.GetTimeStamp(),\n },\n };\n\n const gaEventContinuePayment = {\n ...gaEvent,\n event: 'continue_to_payment',\n };\n\n return [gaEvent, gaEventContinuePayment]; // multiple gaEvent;\n }\n\n CompletedCheckoutEvent(event: IEasyfyEvent): any {\n if (!event.data.checkoutCompletedProducts || event.data.checkoutCompletedProducts.length == 0) throw new Error('No products found');\n\n const userConsents = event.data.userConsents;\n let trueConsents: string[] = [];\n if (userConsents) trueConsents = Object.keys(userConsents).filter((key) => userConsents[key] === true);\n\n const ga4items: any[] = [];\n const siteInfo = EasyfyEventData.SiteInfo();\n\n event.data.checkoutCompletedProducts.forEach((checkoutProduct: IBasketRow) => {\n const product = EasyfyEventData.Product(checkoutProduct.productIdentifier);\n const salesUnitPrice = EasyfyEventData.ProductSalesUnitPrice(checkoutProduct.productIdentifier + '-' + checkoutProduct.salesUnitCode);\n const purchaseFlow = checkoutProduct.purchaseFlow;\n\n ga4items.push({\n discount: null,\n variant: null,\n coupon: null,\n price: salesUnitPrice?.priceExVat,\n index: null,\n item_list_name: event.data.listName,\n item_variant: null,\n item_id: product.Id,\n item_name: product.DisplayName,\n item_brand: product.Brand,\n item_category: product.Categories.length > 0 ? product.Categories[0] : null,\n item_category2: product.Categories.length > 1 ? product.Categories[1] : null,\n item_category3: product.Categories.length > 2 ? product.Categories[2] : null,\n item_category4: product.Categories.length > 3 ? product.Categories[3] : null,\n item_category5: product.Categories.length > 4 ? product.Categories[4] : null,\n quantity: checkoutProduct.qty,\n cd_flavour: product.Flavour,\n cd_format: product.Format,\n cd_product_type: product.ProductType,\n cd_packsize: salesUnitPrice?.packSize,\n cd_purchase_flow: purchaseFlow,\n });\n });\n\n const gaEvent = {\n event: 'purchase',\n ecommerce: {\n transaction_id: event.data.completedCheckoutId,\n value: event.data.totalPriceExVat,\n tax: event.data.totalVatAmount,\n shipping: event.data.shipping,\n currency: siteInfo.currencyCode,\n items: ga4items,\n cd_timestamp: this.GetTimeStamp(),\n email_consent: trueConsents,\n },\n };\n\n return gaEvent;\n }\n\n ViewCartEvent(event: IEasyfyEvent): any {\n const ga4items: any[] = [];\n const siteInfo = EasyfyEventData.SiteInfo();\n const basket = EasyfyEventData.Basket();\n let value: number = 0;\n\n if (basket && basket.rows) {\n basket.rows.forEach((row) => {\n const product = EasyfyEventData.Product(row.productIdentifier);\n const salesUnitPrice = EasyfyEventData.ProductSalesUnitPrice(row.productIdentifier + '-' + row.salesUnitCode);\n\n ga4items.push({\n discount: null,\n variant: null,\n coupon: null,\n price: salesUnitPrice?.priceExVat,\n index: null,\n item_list_name: event.data.listName,\n item_variant: null,\n item_id: product.Id,\n item_name: product.DisplayName,\n item_brand: product.Brand,\n item_category: product.Categories.length > 0 ? product.Categories[0] : null,\n item_category2: product.Categories.length > 1 ? product.Categories[1] : null,\n item_category3: product.Categories.length > 2 ? product.Categories[2] : null,\n item_category4: product.Categories.length > 3 ? product.Categories[3] : null,\n item_category5: product.Categories.length > 4 ? product.Categories[4] : null,\n quantity: row.qty,\n cd_flavour: product.Flavour,\n cd_format: product.Format,\n cd_product_type: product.ProductType,\n cd_packsize: salesUnitPrice?.packSize,\n });\n\n value += salesUnitPrice?.priceExVat * row.qty;\n });\n }\n\n const gaEvent = {\n event: 'view_cart',\n ecommerce: {\n value: value,\n currency: siteInfo.currencyCode,\n items: ga4items,\n cd_timestamp: this.GetTimeStamp(),\n },\n };\n\n return gaEvent;\n }\n\n ExpandConsentEvent(event: IEasyfyEvent): any {\n const data = event.data as ITrackableElement | undefined;\n const interactionSection: string = (data?.Properties.get('consent-type') ?? '').toUpperCase();\n\n const gaEvent = {\n event: 'consent_expansion',\n ecommerce: {\n interaction_section: interactionSection,\n cd_timestamp: this.GetTimeStamp(),\n },\n };\n\n return gaEvent;\n }\n\n GetTimeStamp(): string {\n return new Date().toISOString();\n }\n\n ListId(listName: string, listId: string | null | undefined): string {\n if (!listId || listId.trim().length === 0) {\n listId = listName;\n }\n return listId;\n }\n}\n","import { EasyfyEventData, IDataMapper, IEasyfyEvent, IPageViewData, IQuantityChangedData, ISearchPerformedData, ISessionStarted } from \"@shared/easyfy.events/easyfy.eventdata\";\nimport { EventNames } from \"@shared/easyfy.events/easyfy.eventhandler\";\nimport { EasyfyEventLogger } from \"@shared/easyfy.events/easyfy.event.devlogger\";\nimport { event } from \"../../easyfy.decorators\";\n\n/* Exporter class */\nexport class StatsDataMapper implements IDataMapper {\n\n MapEventData(event: IEasyfyEvent): any {\n var mappedEvent;\n\n switch (event.eventName.toLowerCase()) {\n case EventNames.SessionStarted: {\n mappedEvent = this.BuildSessionStartedEvent(event);\n break;\n }\n case EventNames.PageView: {\n mappedEvent = this.BuildPageViewEvent(event);\n break;\n }\n case EventNames.ProductPageView: {\n mappedEvent = this.BuildProductPageViewEvent(event);\n break;\n }\n case EventNames.SearchPerformed: {\n mappedEvent = this.BuildSearchPerformedEvent(event);\n break;\n }\n case EventNames.AddToCart: {\n if (event.data.isFirstAddForRow) {\n mappedEvent = this.BuildAddToBasketEvent(event);\n }\n else {\n EasyfyEventLogger.Log({ type: \"warning\", message: `Event '${event.eventName}' skipped for stats, conditions not met` });\n }\n break;\n }\n case EventNames.RemoveFromCart: {\n if (event.data.isLastRemoveForRow) {\n mappedEvent = this.BuildRemoveFromBasketEvent(event);\n }\n else {\n EasyfyEventLogger.Log({ type: \"warning\", message: `Event '${event.eventName}' skipped for stats, conditions not met` });\n }\n break;\n }\n case EventNames.QuantityChanged: {\n mappedEvent = this.BuildQuantityChangedEvent(event);\n break;\n }\n\n case EventNames.ProductImpression: {\n mappedEvent = this.BuildProductImpressionEvents(event);\n break;\n }\n }\n\n return mappedEvent;\n }\n\n BuildSessionStartedEvent(event: IEasyfyEvent): any {\n var data = event.data as ISessionStarted;\n return {\n type: \"SessionStarted\",\n TimeStampUtc: this.GetFormattedTimeStamp(),\n Culture: data.Culture,\n Currency: data.Currency,\n IsDesktop: data.IsDesktop,\n IsMobilePhone: data.IsMobilePhone,\n IsTablet: data.IsTablet,\n RecurringUser: data.RecurringUser,\n Referrer: data.Referrer,\n Path: data.Path,\n UserAgent: data.UserAgent\n };\n }\n\n BuildPageViewEvent(event: IEasyfyEvent): any {\n var data = event.data as IPageViewData;\n\n return {\n type: \"PageViewed\",\n Path: this.GetCurrentUrlPath(),\n PageId: data.pageId,\n TimeStampUtc: this.GetFormattedTimeStamp(),\n };\n }\n\n BuildProductPageViewEvent(event: IEasyfyEvent): any {\n if (!event.data.productIdentifier) throw new Error('Product identifier missing');\n var product = EasyfyEventData.Product(event.data.productIdentifier);\n\n return {\n type: \"ProductViewed\",\n ProductId: product.DomainId,\n Path: this.GetCurrentUrlPath(),\n Referrer: document.referrer,\n TimeStampUtc: this.GetFormattedTimeStamp(),\n };\n }\n\n BuildSearchPerformedEvent(event: IEasyfyEvent): any {\n var data = event.data as ISearchPerformedData;\n\n return {\n Path: this.GetCurrentUrlPath(),\n SearchWord: data.searchString,\n TimeStampUtc: this.GetFormattedTimeStamp(),\n type: \"UserSearched\",\n };\n }\n\n BuildAddToBasketEvent(event: IEasyfyEvent): any {\n if (!event.data.productIdentifier) throw new Error('Product identifier missing');\n\n var product = EasyfyEventData.Product(event.data.productIdentifier);\n var salesUnitPrice = EasyfyEventData.ProductSalesUnitPrice(event.data.productIdentifier + \"-\" + event.data.salesUnitCode);\n var productListIndex = EasyfyEventData.ProductIndexInList(event.data.listName, product.Id) + 1;\n var pageInfo = EasyfyEventData.PageInfo();\n\n return {\n type: \"ProductAddedToBasket\",\n Path: this.GetCurrentUrlPath(),\n TimeStampUtc: this.GetFormattedTimeStamp(),\n ProductId: product.DomainId,\n Quantity: event.data.quantity,\n LineNumber: event.data.rowId,\n ListPosition: productListIndex,\n ListType: event.data.listName,\n Origin: pageInfo.PageType,\n View: pageInfo.ViewName\n };\n }\n\n BuildRemoveFromBasketEvent(event: IEasyfyEvent): any {\n var product = EasyfyEventData.Product(event.data.productIdentifier);\n var salesUnitPrice = EasyfyEventData.ProductSalesUnitPrice(event.data.productIdentifier + \"-\" + event.data.salesUnitCode);\n\n return {\n type: \"ProductRemovedFromBasket\",\n Path: this.GetCurrentUrlPath(),\n TimeStampUtc: this.GetFormattedTimeStamp(),\n Sku: product.Id,\n LineNumber: event.data.rowId\n };\n }\n\n BuildQuantityChangedEvent(event: IEasyfyEvent): any {\n var data = event.data as IQuantityChangedData;\n var product = EasyfyEventData.Product(event.data.productIdentifier);\n var salesUnitPrice = EasyfyEventData.ProductSalesUnitPrice(event.data.productIdentifier + \"-\" + event.data.salesUnitCode);\n\n return {\n type: \"ProductQuantityChanged\",\n TimeStampUtc: this.GetFormattedTimeStamp(),\n NewQuantity: data.newQuantity,\n OldQuantity: data.oldQuantity,\n Sku: product.Id,\n LineNumber: event.data.rowId,\n Url: this.GetCurrentUrlPath()\n };\n }\n\n BuildProductImpressionEvents(event: IEasyfyEvent): any[] {\n if (!event.data.productIdentifiers) throw new Error('Product identifiers missing');\n if (!event.data.salesUnitCodes) throw new Error('Product sales unit codes missing');\n if (event.data.salesUnitCodes.length != event.data.productIdentifiers.length) throw new Error('Product sales unit codes and identifiers count missmatch');\n var priceIds: string[] = [];\n var siteInfo = EasyfyEventData.SiteInfo();\n var productImpressions: any[] = [];\n\n for (var i = 0; i < event.data.productIdentifiers.length; i++) {\n priceIds.push(event.data.productIdentifiers[i] + \"-\" + event.data.salesUnitCodes[i]);\n }\n\n var eventProducts = EasyfyEventData.Products(event.data.productIdentifiers);\n var eventPrices = EasyfyEventData.ProductSalesUnitPrices(priceIds);\n\n for (var i = 0; i < eventProducts.length; i++) {\n var product = eventProducts[i];\n var salesUnitPrice = eventPrices[i];\n\n var index = eventProducts.indexOf(product);\n var productListIndex = EasyfyEventData.ProductIndexInList(event.data.listIds[index], product.Id) + 1;\n\n productImpressions.push({\n type: \"ProductImpression\",\n TimeStampUtc: this.GetFormattedTimeStamp(),\n ListPosition: productListIndex,\n ListType: event.data.listIds[index],\n Path: this.GetCurrentUrlPath(),\n ProductId: product.DomainId,\n });\n }\n\n return productImpressions;\n }\n\n GetCurrentUrlPath(): string {\n return window.location.pathname;\n }\n\n GetFormattedTimeStamp(): string {\n var date = (new Date).toISOString();\n return date;\n }\n}","import { IProductData, EasyfyEventData, IDataMapper, IEasyfyEvent, IPageViewData } from \"@shared/easyfy.events/easyfy.eventdata\";\nimport { EventNames } from \"@shared/easyfy.events/easyfy.eventhandler\";\n\n/* Exporter class */\nexport class KlaviyoDataMapper implements IDataMapper {\n MapEventData(event: IEasyfyEvent): any {\n var mappedEvent: any;\n\n switch (event.eventName.toLowerCase()) {\n\n case EventNames.ProductPageView: {\n mappedEvent = this.ViewItemEvent(event);\n break;\n }\n case EventNames.PageView: {\n mappedEvent = this.PageViewEvent(event);\n break;\n }\n case EventNames.AddToCart: {\n mappedEvent = this.AddToCartEvent(event);\n break;\n }\n case EventNames.StartedCheckout: {\n mappedEvent = this.StartedCheckoutEvent(event);\n break;\n }\n case EventNames.CompletedCheckout: {\n mappedEvent = this.CompletedCheckoutEvent(event);\n break;\n }\n case EventNames.LoggedIn: {\n mappedEvent = this.LoggedInEvent(event);\n break;\n }\n case EventNames.LoggedOut: {\n mappedEvent = this.LoggedOutEvent(event);\n break;\n }\n // more events to come here...\n }\n return mappedEvent;\n }\n\n\n ViewItemEvent(event: IEasyfyEvent): any {\n if (!event.data.productIdentifier) throw new Error('Product identifier missing');\n\n var product = EasyfyEventData.Product(event.data.productIdentifier);\n var siteInfo = EasyfyEventData.SiteInfo();\n\n var klaviyoEvent = {\n event: \"Viewed Product\",\n data: {\n ProductName: product.DisplayName,\n ProductID: product.Id,\n Brand: product.Brand,\n ProductType: product.ProductType,\n Flavour: product.Flavour,\n Format: product.Format,\n Price: product.Price,\n PriceExVat: product.PriceExVat,\n Currency: siteInfo.currencyCode,\n CampaignCode: product.CampaignCode\n }\n };\n\n return klaviyoEvent;\n }\n\n\n PageViewEvent(event: IEasyfyEvent): any {\n var data = event.data as IPageViewData;\n var klaviyoEvent = {\n event: \"Viewed Page\",\n data: {\n Path: window.location.pathname,\n FullPath: window.location.href,\n PageId: data.pageId,\n TimeStampUtc: (new Date).toISOString()\n }\n };\n\n return klaviyoEvent;\n }\n\n AddToCartEvent(event: IEasyfyEvent): any {\n const basket = EasyfyEventData.Basket();\n if (!basket || basket.rows.length == 0) {\n return;\n }\n var siteInfo = EasyfyEventData.SiteInfo();\n const items: any[] = [];\n const itemNames: string[] = [];\n basket.rows.forEach((basketProduct) => {\n var product = EasyfyEventData.Product(basketProduct.productIdentifier);\n items.push({\n ProductID: product.Id,\n SKU: product.Id,\n ProductName: product.DisplayName,\n Quantity: basketProduct.qty,\n ItemPrice: product.Price,\n RowTotal: product.Price * basketProduct.qty,\n ProductURL: product.AbsoluteProductUrl,\n ImageURL: product.ProductImageUrl,\n ProductCategories:\n product.Categories.length > 0 ? product.Categories.toString() : [product.ProductType],\n Brand: product.Brand,\n });\n itemNames.push(product.DisplayName);\n });\n var lastItem = items[items.length - 1];\n const klaviyoEvent = {\n event: \"Added to Cart\",\n data: {\n $value: basket.priceIncVat,\n AddedItemProductName: lastItem.ProductName,\n AddedItemProductID: lastItem.ProductID,\n AddedItemSKU: lastItem.SKU,\n AddedItemCategories: lastItem.ProductCategories,\n AddedItemImageURL: lastItem.ImageURL,\n AddedItemURL: lastItem.ProductURL,\n AddedItemPrice: lastItem.ItemPrice,\n AddedItemQuantity: lastItem.Quantity,\n ItemNames: itemNames.toString(),\n CheckoutURL: siteInfo.checkoutPath,\n Items: items\n }\n };\n return klaviyoEvent;\n }\n\n StartedCheckoutEvent(event: IEasyfyEvent): any {\n if (!event.data.checkoutProducts || event.data.checkoutProducts.length == 0) throw new Error('No products found');\n\n var items: any[] = [];\n var itemNames: string[] = [];\n let categories: Set = new Set();\n var checkoutValue: any = 0;\n\n\n event.data.checkoutProducts.forEach((checkoutProduct) => {\n var product = EasyfyEventData.Product(checkoutProduct.productIdentifier);\n var salesUnitPrice = EasyfyEventData.ProductSalesUnitPrice(checkoutProduct.productIdentifier + \"-\" + checkoutProduct.salesUnitCode);\n\n categories.add(product.ProductType)\n\n itemNames.push(product.DisplayName);\n\n items.push({\n ProductID: product.Id,\n SKU: product.Id,\n ProductName: product.DisplayName,\n Quantity: checkoutProduct.qty,\n ProductURL: product.AbsoluteProductUrl,\n ImageURL: product.ProductImageUrl,\n ProductCategories: product.Categories.length > 0 ? product.Categories.toString() : [product.ProductType],\n });\n\n checkoutValue += salesUnitPrice.priceIncVat * checkoutProduct.qty;\n });\n\n\n var siteInfo = EasyfyEventData.SiteInfo();\n var klaviyoEvent = {\n event: \"Started Checkout\",\n data: {\n Categories: Array.from(categories.values()),\n CheckoutURL: siteInfo.checkoutPath,\n ItemNames: itemNames,\n Items: items,\n $value: checkoutValue\n }\n };\n\n return klaviyoEvent;\n }\n\n CompletedCheckoutEvent(event: IEasyfyEvent): any {\n if (event.data.registeredCustomerEmail) {\n var klaviyoEvent = {\n event: null,\n data: null,\n identify: event.data.registeredCustomerEmail\n };\n\n return klaviyoEvent;\n }\n }\n\n LoggedInEvent(event: IEasyfyEvent): any {\n var klaviyoEvent = {\n event: \"Logged In\",\n data: {\n email: event.data.email\n },\n identify: event.data.email\n };\n\n return klaviyoEvent;\n }\n\n LoggedOutEvent(event: IEasyfyEvent): any {\n var klaviyoEvent = {\n event: \"Logged Out\",\n data: {\n email: event.data.email\n }\n };\n\n return klaviyoEvent;\n }\n}\n\nclass KlaviyoProduct implements IProductData {\n Id: any;\n Ean: any;\n DisplayName: any;\n Brand: any;\n Categories: any[];\n Price: number;\n PriceExVat: number;\n CampaignCode: string;\n Flavour: string;\n Format: string;\n ProductType: string;\n DomainId: string;\n AbsoluteProductUrl: string;\n RelativeProductUrl: string;\n ProductImageUrl: string;\n}","\nnamespace Easyfy.Shared.Scripts {\n export interface IGtmEvent {\n event: string;\n ecommerce: object;\n }\n\n export interface IActionField {\n list: string;\n }\n\n export interface ICheckoutActionField {\n step: number;\n option: string;\n }\n export interface IGtmImpressionProduct extends ProductBase {\n position: number;\n list: string;\n }\n\n export interface IGtmClickProduct extends ProductBase {\n position: number;\n dimension6: string; // depict-recommendation\n }\n\n export interface IGtmBasketProduct extends ProductBase {\n quantity: number;\n }\n\n export interface IGtmDetailProduct extends ProductBase { };\n\n interface ProductBase {\n name: string;\n id: string;\n price: number;\n brand: string,\n category: string;\n variant: string;\n dimension3: string; // product-type\n dimension4: string; // ean\n dimension5: string; // all-categories\n dimension7: string; //prescriptive (excluded for facebook)\n }\n\n\n export interface IGtmProductImpressionEvent {\n impressions: IGtmImpressionProduct[];\n currencyCode: string;\n };\n\n export interface IGtmProductClickEvent {\n click: {\n actionField: IActionField;\n products: IGtmClickProduct[];\n currencyCode: string;\n }\n };\n\n export interface IGtmProductDetailEvent {\n detail: {\n actionField: IActionField;\n products: IGtmDetailProduct[];\n currencyCode: string;\n }\n }\n\n export interface IGtmProductRemoveEvent {\n remove: {\n actionField: IActionField;\n products: IGtmBasketProduct[];\n }\n };\n\n export interface IGtmProductAddEvent {\n add: {\n actionField: IActionField;\n products: IGtmBasketProduct[];\n currencyCode: string;\n }\n };\n\n export interface IGtmCheckoutEvent {\n checkout: {\n actionField: ICheckoutActionField;\n products: IGtmBasketProduct[];\n }\n };\n\n export const PushProductImpressionEvent = async (eventProducts: IGtmImpressionProduct[], listName: string, currencyCode: string): Promise => {\n let impressionEvent: IGtmProductImpressionEvent = {\n impressions: eventProducts,\n currencyCode: currencyCode\n };\n let gtmEvent: IGtmEvent = {\n event: \"impressions\",\n ecommerce: impressionEvent\n }\n PushToDataLayer(gtmEvent);\n };\n\n export const PushProductClickEvent = async (eventProducts: IGtmClickProduct[], listName: string, currencyCode: string): Promise => {\n let clickEvent: IGtmProductClickEvent = {\n click: {\n actionField: {\n list: ListNameCleanUp(listName)\n },\n products: eventProducts,\n currencyCode: currencyCode\n }\n };\n let gtmEvent: IGtmEvent = {\n event: \"productClick\",\n ecommerce: clickEvent\n }\n PushToDataLayer(gtmEvent);\n };\n\n export const PushProductDetailEvent = async (eventProducts: IGtmDetailProduct[], listName: string, currencyCode): Promise => {\n let detailEvent: IGtmProductDetailEvent = {\n detail: {\n actionField: {\n list: ListNameCleanUp(listName)\n },\n products: eventProducts,\n currencyCode: currencyCode\n }\n };\n let gtmEvent: IGtmEvent = {\n event: \"productDetail\",\n ecommerce: detailEvent\n }\n PushToDataLayer(gtmEvent);\n };\n\n export const PushProductAddEvent = async (eventProducts: IGtmBasketProduct[], listName: string, currencyCode: string): Promise => {\n let removeEvent: IGtmProductAddEvent = {\n add: {\n actionField: {\n list: ListNameCleanUp(listName)\n },\n products: eventProducts,\n currencyCode: currencyCode\n }\n };\n let gtmEvent: IGtmEvent = {\n event: \"addToCart\",\n ecommerce: removeEvent\n }\n PushToDataLayer(gtmEvent);\n };\n\n export const PushProductRemoveEvent = async (eventProducts: IGtmBasketProduct[], listName: string): Promise => {\n let removeEvent: IGtmProductRemoveEvent = {\n remove: {\n actionField: {\n list: ListNameCleanUp(listName)\n },\n products: eventProducts,\n }\n };\n let gtmEvent: IGtmEvent = {\n event: \"removeFromCart\",\n ecommerce: removeEvent\n }\n PushToDataLayer(gtmEvent);\n };\n\n export const PushCheckoutEvent = async (eventProducts: IGtmBasketProduct[], step: number, option: string): Promise => {\n let checkoutEvent: IGtmCheckoutEvent = {\n checkout: {\n actionField: {\n step: step,\n option: option\n },\n products: eventProducts,\n }\n };\n let gtmEvent: IGtmEvent = {\n event: \"checkout\",\n ecommerce: checkoutEvent\n }\n PushToDataLayer(gtmEvent);\n };\n\n export const HandleDataEvents = async (response: any): Promise => {\n if (response?.data?.dataLayer) {\n BuildAndPushEvents(response.data.dataLayer);\n }\n return response;\n };\n\n export const BuildAndPushEvents = async (dataEvents: any): Promise => {\n if (!dataEvents) return;\n\n dataEvents.forEach(dataEvent => {\n let gtmEvent: IGtmEvent = null;\n if (!dataEvent?.eventName) return;\n\n switch (dataEvent.eventName) {\n case 'addToCart': {\n let products: IGtmBasketProduct[] = [];\n dataEvent.products.forEach(dataProduct => {\n let product: IGtmBasketProduct = {\n brand: dataProduct.brand,\n category: dataProduct.category,\n id: dataProduct.id,\n name: dataProduct.name,\n price: dataProduct.price,\n variant: dataProduct.variant,\n quantity: dataProduct.quantity,\n dimension3: dataProduct.dimension3,\n dimension4: dataProduct.dimension4,\n dimension5: dataProduct.dimension5,\n dimension7: dataProduct.dimension7\n };\n products.push(product);\n });\n PushProductAddEvent(products, dataEvent.listName, dataEvent.currencyCode);\n break;\n }\n case 'removeFromCart': {\n let products: IGtmBasketProduct[] = [];\n dataEvent.products.forEach(dataProduct => {\n let product: IGtmBasketProduct = {\n brand: dataProduct.brand,\n category: dataProduct.category,\n id: dataProduct.id,\n name: dataProduct.name,\n price: dataProduct.price,\n variant: dataProduct.variant,\n quantity: dataProduct.quantity,\n dimension3: dataProduct.dimension3,\n dimension4: dataProduct.dimension4,\n dimension5: dataProduct.dimension5,\n dimension7: dataProduct.dimension7\n };\n products.push(product);\n });\n PushProductRemoveEvent(products, dataEvent.listName)\n break;\n }\n case 'productClick': {\n let clickProducts: IGtmClickProduct[] = [];\n dataEvent.products.forEach(dataProduct => {\n let clickProduct: IGtmClickProduct = {\n brand: dataProduct.brand,\n category: dataProduct.category,\n id: dataProduct.id,\n name: dataProduct.name,\n price: dataProduct.price,\n variant: dataProduct.variant,\n position: dataProduct.position,\n dimension3: dataProduct.dimension3,\n dimension4: dataProduct.dimension4,\n dimension5: dataProduct.dimension5,\n dimension6: \"\",\n dimension7: dataProduct.dimension7\n };\n clickProducts.push(clickProduct);\n });\n PushProductClickEvent(clickProducts, dataEvent.listName, dataEvent.currencyCode)\n break;\n }\n case 'impressions': {\n let impressionProducts: IGtmImpressionProduct[] = [];\n dataEvent.products.forEach(dataProduct => {\n let impressionProduct: IGtmImpressionProduct = {\n brand: dataProduct.brand,\n category: dataProduct.category,\n id: dataProduct.id,\n name: dataProduct.name,\n price: dataProduct.price,\n variant: dataProduct.variant,\n position: dataProduct.position,\n list: ListNameCleanUp(dataProduct.list),\n dimension3: dataProduct.dimension3,\n dimension4: dataProduct.dimension4,\n dimension5: dataProduct.dimension5,\n dimension7: dataProduct.dimension7\n };\n impressionProducts.push(impressionProduct);\n });\n PushProductImpressionEvent(impressionProducts, dataEvent.listName, dataEvent.currencyCode)\n break;\n }\n case 'checkout': {\n let products: IGtmBasketProduct[] = [];\n dataEvent.products.forEach(dataProduct => {\n let product: IGtmBasketProduct = {\n brand: dataProduct.brand,\n category: dataProduct.category,\n id: dataProduct.id,\n name: dataProduct.name,\n price: dataProduct.price,\n variant: dataProduct.variant,\n quantity: dataProduct.quantity,\n dimension3: dataProduct.dimension3,\n dimension4: dataProduct.dimension4,\n dimension5: dataProduct.dimension5,\n dimension7: dataProduct.dimension7\n };\n products.push(product);\n });\n PushCheckoutEvent(products, dataEvent.step, dataEvent.option)\n break;\n }\n case 'productDetail': {\n let detailProducts: IGtmDetailProduct[] = [];\n dataEvent.products.forEach(dataProduct => {\n let detailProduct: IGtmDetailProduct = {\n brand: dataProduct.brand,\n category: dataProduct.category,\n id: dataProduct.id,\n name: dataProduct.name,\n price: dataProduct.price,\n variant: dataProduct.variant,\n dimension3: dataProduct.dimension3,\n dimension4: dataProduct.dimension4,\n dimension5: dataProduct.dimension5,\n dimension7: dataProduct.dimension7\n };\n detailProducts.push(detailProduct);\n });\n PushProductDetailEvent(detailProducts, dataEvent.listName, dataEvent.currencyCode)\n break;\n }\n default: {\n console.warn(\"Faulty data event: propterties name?\")\n console.dir(dataEvent);\n }\n }\n });\n };\n\n async function PushToDataLayer(gtmEvent: any): Promise {\n if (!gtmEvent) return;\n window['dataLayer'] = window['dataLayer'] || [];\n window['dataLayer'].push(gtmEvent);\n\n /* - For debugging the dataLayer - */\n //console.group('%c GA DataLayer ', 'color: #bada55');\n //console.dir(window['dataLayer']);\n //console.groupEnd();\n };\n\n const ListNameCleanUp = (listname: string): string => {\n if (!listname) return null;\n let cleanedListName = listname.replace(/\\s+/g, '').replace('&', '').toLowerCase();\n\n return cleanedListName;\n };\n}\n\nexport default Easyfy.Shared.Scripts;","import axios, { AxiosRequestConfig } from 'axios';\nimport EasyfyDataLayer from '@shared/easyfy.datalayer';\nimport Event from './easyfy.events/easyfy.eventhandler';\n\nnamespace Easyfy.Shared.Scripts {\n export interface IExtraHeaders {\n key: string;\n value: string;\n }\n\n export const get = async (url: string, config?: AxiosRequestConfig): Promise => {\n axios.defaults.headers.common[\"IsAxiosRequest\"] = true;\n axios.defaults.headers.common[\"OriginalUrl\"] = window.location.href;\n\n url = generateFullPathWithPrefix(url);\n\n var response = await axios.get(url, config);\n Event.EasyfyEventHandler.RegisterResponseData(response);\n return await EasyfyDataLayer.HandleDataEvents(response);\n };\n\n export const post = async (url: string, data: any, token?: string, config?: AxiosRequestConfig) => {\n if (token) {\n axios.defaults.headers.common[\"RequestVerificationToken\"] = token;\n }\n axios.defaults.headers.common[\"IsAxiosRequest\"] = true;\n axios.defaults.headers.common[\"OriginalUrl\"] = window.location.href;\n\n url = generateFullPathWithPrefix(url);\n\n var response = await axios.post(url, data, config);\n Event.EasyfyEventHandler.RegisterResponseData(response);\n return await EasyfyDataLayer.HandleDataEvents(response);\n };\n\n export const patch = async (url: string, data: any, token?: string, config?: AxiosRequestConfig) => {\n if (token) {\n axios.defaults.headers.common[\"RequestVerificationToken\"] = token;\n }\n axios.defaults.headers.common[\"IsAxiosRequest\"] = true;\n axios.defaults.headers.common[\"OriginalUrl\"] = window.location.href;\n\n url = generateFullPathWithPrefix(url);\n\n var response = await axios.patch(url, data, config);\n Event.EasyfyEventHandler.RegisterResponseData(response);\n return await EasyfyDataLayer.HandleDataEvents(response)\n };\n\n export const axiosDelete = async (url: string, token?: string, config?: AxiosRequestConfig) => {\n if (token) {\n axios.defaults.headers.common[\"RequestVerificationToken\"] = token;\n }\n axios.defaults.headers.common[\"IsAxiosRequest\"] = true;\n axios.defaults.headers.common[\"OriginalUrl\"] = window.location.href;\n\n url = generateFullPathWithPrefix(url);\n\n var response = await axios.delete(url, config);\n Event.EasyfyEventHandler.RegisterResponseData(response);\n return await EasyfyDataLayer.HandleDataEvents(response)\n };\n\n function generateFullPathWithPrefix(url: string): string {\n var prefixPath = document.documentElement?.getAttribute(\"data-prefix-path\");\n if (url && !url.startsWith(\"/\"))\n url = \"/\" + url;\n if (prefixPath) {\n prefixPath = prefixPath.endsWith(\"/\") ? prefixPath.slice(0, -1) : prefixPath;\n if (prefixPath.length > 1 && !prefixPath.startsWith(\"/\"))\n prefixPath = \"/\" + prefixPath;\n if (url)\n return prefixPath + url;\n else\n return prefixPath;\n }\n else\n return url;\n }\n}\n\nexport default Easyfy.Shared.Scripts;","import easyfyAxios from '@shared/easyfy.axios';\n\nnamespace Easyfy.Web.Services.Search {\n export interface ISearchData {\n includeArticles: boolean;\n includeBrands: boolean;\n includePages: boolean;\n searchTerm: string;\n partialView?: string;\n subscriptionProductsOnly?: boolean;\n }\n\n export interface IFocusInParams {\n GetPopularResults: boolean;\n GetCampaignResults: boolean;\n }\n\n export const Search = async (data: ISearchData, token: string): Promise => {\n return await easyfyAxios.post('/search', data, token);\n };\n\n export const GetFocusInData = async (data: IFocusInParams, token: string): Promise => {\n return await easyfyAxios.post('/search?handler=focusin', data, token);\n };\n}\n\nexport default Easyfy.Web.Services.Search;","import {globalEvent} from '@shared/easyfy.core';\nimport {invoke} from '@shared/easyfy.decorators';\nimport { hide, parseToBoolean, show, isMobile, addCss, removeCss, debounce } from '@shared/easyfy.utils';\nimport searchService from '@webServices/search.service';\nexport class SearchConfig {\n\n constructor(\n thresholdVolume: number = 3,\n displayStyle: string = \"block\",\n ) {\n\n this.ThresholdVolume = thresholdVolume;\n this.DisplayStyle = displayStyle;\n }\n\n public ThresholdVolume: number;\n public DisplayStyle: string;\n}\n\nnamespace Easyfy.Modules {\n\n @invoke\n export class Search {\n static Instance: Search;\n\n private backdrop: HTMLElement;\n private searchForm: HTMLElement;\n private searchInput: HTMLInputElement;\n private searchResults: HTMLElement;\n private searchBarElement: HTMLElement;\n private searchIcon: HTMLElement;\n private campaignResults: HTMLElement = null;\n private popularResults: HTMLElement = null;\n\n private pendingSearch: string;\n private focusInCampaignData: string = null;\n private focusInPopularData: string = null;\n\n private initialized: boolean;\n\n private thresholdVolume: number;\n private showPopularResultsOnFocusIn: boolean;\n private showCampaignsOnFocusIn: boolean;\n public keepPopularResultsOnSearch: boolean;\n public keepCampaignProductsOnSearch: boolean;\n public keepCampaignsOnSearch: boolean;\n public showPopularResultsIfNoResults: boolean;\n public displayStyle: string;\n public preventSubmit: boolean;\n\n constructor(config: SearchConfig) {\n Search.Instance = this;\n\n if (config != null) {\n Search.Instance.thresholdVolume = config.ThresholdVolume;\n Search.Instance.displayStyle = config.DisplayStyle;\n }\n }\n\n OnInit() {\n \n globalEvent({\n type: 'focusin',\n event: {\n action: 'search-input',\n callback: Search.onSearch\n }\n });\n\n globalEvent({\n type: 'keyup',\n event: {\n action: 'search-input',\n callback: debounce(Search.onSearch, 500)\n }\n });\n\n globalEvent({\n type: 'click',\n event: {\n event: 'search-close',\n callback: Search.CloseSearch\n }\n });\n\n globalEvent({\n type: 'click',\n event: {\n action: 'search-suggestion',\n callback: Search.onSearchSuggestion\n }\n });\n\n globalEvent({\n type: 'click',\n event: {\n action: 'search-open',\n callback: Search.onSearchOpen\n }\n });\n \n }\n private static onSearchOpen = async (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n // trigger click\n const el = e.target as HTMLElement;\n const fromEl = el?.parentElement as HTMLElement;\n const searchInputElement = fromEl?.querySelector('[data-action=\"search-input\"]') as HTMLInputElement;\n \n if (!searchInputElement) return false;\n await Search.initNewSearchInstance(searchInputElement);\n Search.Instance.initialized = true;\n searchInputElement.focus();\n\n return false;\n }\n\n private static onSearch = async (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n\n if (e.type === 'focusin') {\n await Search.initNewSearchInstance(e.target as HTMLInputElement);\n Search.Instance.initialized = true;\n }\n\n if (e.key === \"Escape\"){\n Search.CloseSearch(e);\n } else if (e.type === 'focusin' || e.type === 'keyup') {\n\n Search.Instance.ShowBackdrop(null);\n\n if (Search.Instance.searchIcon) show(Search.Instance.searchIcon);\n\n const value: string = Search.Instance.searchInput.value.trim() ?? '';\n\n //prevents multiple requests from different events for same query\n if (Search.Instance.pendingSearch !== value?.trim()) {\n Search.Instance.pendingSearch = value?.trim();\n\n const targetAttrs = e.target.attributes;\n const token = targetAttrs['data-token']?.value;\n\n if (Search.ShouldSearchBasedOnUserInput()) {\n\n await Search.GetSearchDataBasedOnUserInput(targetAttrs, token);\n\n if (!Search.Instance.keepPopularResultsOnSearch && Search.Instance.popularResults != null){\n Search.Instance.popularResults.style.display = 'none';\n }\n\n if (!Search.Instance.keepCampaignProductsOnSearch && Search.Instance.popularResults != null){\n Search.Instance.popularResults.style.display = 'none';\n }\n\n } else if (Search.ShouldGetFocusInData()) {\n\n if (!Search.Instance.keepPopularResultsOnSearch && Search.Instance.popularResults != null){\n Search.Instance.popularResults.style.display = 'none';\n }\n\n if (!Search.Instance.keepCampaignProductsOnSearch && Search.Instance.popularResults != null){\n Search.Instance.popularResults.style.display = 'none';\n }\n\n await Search.GetFocusInData(token);\n\n } else if (!Search.Instance.initialized) {\n\n Search.Instance.SearchClear();\n\n }\n\n if (Search.ShouldHideSearchBasedOnUserInput()){\n Search.Instance.searchResults.style.display = 'none';\n }\n }\n }\n\n return false;\n }\n\n private static onSearchSuggestion = async (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n const element: HTMLElement = e.target as HTMLElement;\n const newValue = element.attributes['data-value']?.value;\n\n Search.Instance.searchInput.value = newValue;\n Search.Instance.searchInput.focus();\n\n return false;\n }\n\n private static ShouldSearchBasedOnUserInput() {\n return Search.Instance.pendingSearch != null && Search.Instance.pendingSearch?.length >= Search.Instance.thresholdVolume;\n }\n\n private static ShouldHideSearchBasedOnUserInput() {\n return Search.Instance.pendingSearch != null && Search.Instance.pendingSearch?.length < Search.Instance.thresholdVolume;\n }\n\n private static ShouldGetFocusInData() {\n return (Search.Instance.showPopularResultsOnFocusIn || Search.Instance.showCampaignsOnFocusIn)\n && Search.Instance.pendingSearch != null && Search.Instance.pendingSearch?.length < Search.Instance.thresholdVolume;\n }\n\n private static GetSearchDataBasedOnUserInput = async (targetAttrs: any, token: any) => {\n const element = document.querySelector('.subcription-interval .value[data-subscription-interval]');\n const interval = element ? element.getAttribute('data-subscription-interval') : '';\n const searchData = {\n includeArticles: parseToBoolean(targetAttrs['data-include-articles']?.value),\n includeBrands: parseToBoolean(targetAttrs['data-include-brands']?.value),\n includePages: parseToBoolean(targetAttrs['data-include-pages']?.value),\n includeProductSeries: parseToBoolean(targetAttrs['data-include-productseries']?.value),\n subscriptionProductsOnly: parseToBoolean(targetAttrs['data-query-subscriptions']?.value),\n searchTerm: Search.Instance.pendingSearch,\n subscriptionInterval: interval,\n preventSubmit: Search.Instance.preventSubmit\n };\n\n searchService.Search(searchData, token).then((response) => {\n if (Search.Instance.pendingSearch == response.data.query) {\n Search.Instance.pendingSearch = null;\n }\n\n if (response.data.success) {\n //ignore result if input was emptied during fetch of data\n if (Search.Instance.searchInput.value.trim()) {\n Search.Instance.searchResults.innerHTML = response.data.partial;\n show(Search.Instance.searchResults, Search.Instance.displayStyle);\n \n var noResultsContainer = document.querySelector('[data-container=\"no-results\"]');\n if (noResultsContainer != null && Search.Instance.showPopularResultsIfNoResults && Search.Instance.popularResults != null) {\n Search.Instance.popularResults.style.display = Search.Instance.displayStyle;\n } else if (Search.Instance.popularResults != null) {\n Search.Instance.popularResults.style.display = 'none';\n }\n }\n }\n });\n }\n\n private static GetFocusInData = async (token: any) => {\n\n // don't get focusIn data from server if we already have it in this instance\n if (Search.Instance.focusInCampaignData != null || Search.Instance.focusInPopularData != null) {\n\n Search.Instance.campaignResults != null ? Search.Instance.campaignResults.innerHTML = Search.Instance.focusInCampaignData : null;\n Search.Instance.campaignResults != null ? Search.Instance.campaignResults.style.display = Search.Instance.displayStyle : false;\n \n Search.Instance.popularResults != null ? Search.Instance.popularResults.innerHTML = Search.Instance.focusInPopularData : null;\n Search.Instance.popularResults != null ? Search.Instance.popularResults.style.display = Search.Instance.displayStyle : false;\n\n return;\n }\n\n const focusInParams = {\n GetPopularResults: Search.Instance.showPopularResultsOnFocusIn,\n GetCampaignResults: Search.Instance.showCampaignsOnFocusIn\n }\n\n searchService.GetFocusInData(focusInParams, token).then((response) => {\n\n if (Search.Instance.pendingSearch == response.data.query) {\n Search.Instance.pendingSearch = null;\n }\n\n if (response.data.success) {\n\n Search.Instance.campaignResults.innerHTML = response.data.partialCampaignResults;\n Search.Instance.focusInCampaignData = response.data.partialCampaignResults;\n\n Search.Instance.popularResults.innerHTML = response.data.partialPopularResults;\n Search.Instance.focusInPopularData = response.data.partialPopularResults;\n\n if (Search.Instance.popularResults.innerHTML !== \"\"){\n Search.Instance.popularResults.style.display = Search.Instance.displayStyle;\n }\n\n if (Search.Instance.campaignResults.innerHTML !== \"\"){\n Search.Instance.campaignResults.style.display = Search.Instance.displayStyle;\n }else{\n Search.Instance.campaignResults.style.display = 'none';\n }\n }\n });\n }\n\n private static initNewSearchInstance = async (searchInputElement: HTMLInputElement) => {\n const searchBar = searchInputElement.closest('[data-container=\"search-bar\"]')\n \n Search.Instance.searchBarElement = searchInputElement.closest('[data-container=\"search-bar\"]');\n Search.Instance.searchBarElement.classList.add('active');\n Search.Instance.searchInput = searchInputElement;\n Search.Instance.searchResults = Search.Instance.searchBarElement.querySelector('[data-container=\"search-result\"]') as HTMLElement;\n Search.Instance.campaignResults = Search.Instance.searchBarElement.querySelector('[data-container=\"campaign-results\"]') as HTMLElement;\n Search.Instance.popularResults = Search.Instance.searchBarElement.querySelector('[data-container=\"popular-results\"]') as HTMLElement;\n Search.Instance.backdrop = searchBar?.parentNode?.querySelector('[data-container=\"search-backdrop\"]') as HTMLElement;\n Search.Instance.backdrop?.classList.add('active');\n Search.Instance.searchIcon = Search.Instance.searchBarElement.querySelector('[data-event=\"search-close\"]') as HTMLElement;\n Search.Instance.searchForm = Search.Instance.searchBarElement.querySelector('form');\n Search.Instance.preventSubmit = parseToBoolean(searchInputElement.attributes['data-prevent-submit']?.value);\n Search.Instance.showPopularResultsOnFocusIn = parseToBoolean(searchInputElement.attributes['data-show-popular-results']?.value)\n Search.Instance.showCampaignsOnFocusIn = parseToBoolean(searchInputElement.attributes['data-show-campaigns']?.value)\n Search.Instance.keepPopularResultsOnSearch = parseToBoolean(searchInputElement.attributes['data-keep-popular-results']?.value)\n Search.Instance.keepCampaignsOnSearch = parseToBoolean(searchInputElement.attributes['data-keep-campaigns']?.value)\n Search.Instance.showPopularResultsIfNoResults = parseToBoolean(searchInputElement.attributes['data-show-popular-results-if-no-results']?.value)\n\n if (Search.Instance.backdrop != null && isMobile()) {\n document.body.style.overflow = 'hidden';\n addCss(document.body, 'noof')\n }\n\n if (Search.Instance.preventSubmit) Search.preventSubmit();\n\n if (!Search.Instance.preventSubmit) Search.preventEmptySearch();\n Search.hideSearchEventListener();\n }\n\n private static hideSearchEventListener = () => {\n const backdrop = Search.Instance.backdrop;\n backdrop?.addEventListener('click', (event: any) => {\n if (!backdrop.contains(event.target) || (event.target.hasAttribute('data-container') && event.target.attributes['data-container']?.value == 'search-backdrop')) {\n Search.Instance.SearchClear();\n document.body.style.overflow = 'auto';\n }\n }, {once: true});\n }\n\n private static CloseSearch(e) {\n e.preventDefault();\n e.stopPropagation();\n\n Search.Instance.SearchClear();\n\n return false;\n }\n\n private static preventEmptySearch = () => {\n Search.Instance.searchForm?.addEventListener('submit', (e) => {\n if (!Search.Instance.searchInput.value) {\n e.preventDefault();\n return;\n };\n })\n }\n\n private static preventSubmit = () => {\n Search.Instance.searchForm?.addEventListener('submit', (e) => {\n e.preventDefault();\n return;\n })\n }\n\n SearchClear() {\n Search.Instance.HideSearchResult(null);\n Search.Instance.HideBackdrop(null);\n Search.Instance.searchInput.blur();\n Search.Instance.searchInput.value = \"\";\n\n if (document.body.style.overflow == 'hidden') document.body.style.overflow = 'auto';\n removeCss(document.body, 'noof');\n\n if (Search.Instance.searchIcon != null) {\n hide(Search.Instance.searchIcon);\n }\n }\n\n SearchBarInFocus(e) {\n if (e.type === 'focusin') {\n if (!Search.Instance.IsEventTargetInsideSearch(e) && Search.Instance.searchResults != null) {\n hide(Search.Instance.searchResults);\n }\n }\n }\n\n HideSearchResult(e: any) {\n e?.target ? (!Search.Instance.IsEventTargetInsideSearch(e) ? hide(Search.Instance.searchResults) : '') : hide(Search.Instance.searchResults);\n Search.Instance.searchBarElement.classList.remove('active');\n }\n\n ShowSearchResult(e: any) {\n e?.target ? (!Search.Instance.IsEventTargetInsideSearch(e) ? show(Search.Instance.searchResults, Search.Instance.displayStyle) : '') : show(Search.Instance.searchResults, Search.Instance.displayStyle);\n }\n\n HideBackdrop(e: any) {\n e?.target ? (!Search.Instance.IsEventTargetInsideSearch(e) ? Search.Instance.backdrop?.classList.add('active') : '') : Search.Instance.backdrop?.classList.remove('active');\n }\n\n ShowBackdrop(e: any) {\n if (Search.Instance.backdrop)\n e?.target ? (!Search.Instance.IsEventTargetInsideSearch(e) ? Search.Instance.backdrop?.classList.remove('active') : '') : Search.Instance.backdrop?.classList.add('active');\n }\n\n IsEventTargetInsideSearch(e: any) {\n if (this.searchBarElement == null) {\n return false;\n }\n\n return this.searchBarElement.contains(e.target);\n }\n }\n}\n\nexport default Easyfy.Modules;","import easyfyAxios from '@shared/easyfy.axios';\n\nnamespace Easyfy.Inline.Services {\n export const PostForm = (url: string, data: any) => {\n return easyfyAxios.post(url, data);\n };\n}\n\nexport default Easyfy.Inline.Services;","import { globalEvent } from '@shared/easyfy.core';\n\nexport default class Toaster {\n static CssClass: string;\n static Instance: Toaster;\n\n constructor(cssClass: string) {\n Toaster.Instance = this;\n Toaster.CssClass = cssClass;\n\n globalEvent({\n type: 'click',\n event: {\n action: 'remove-alerter',\n callback: Toaster.onRemoveToaster\n }\n });\n }\n\n onInit() {\n }\n\n static toaster(severity: MessageSeverity, message: string, element?: HTMLElement, timeBeforeRemoved?: number, basketOpen?: boolean, extraClass?: string, icon?: string, doNotShowRemove?: boolean) {\n let html = ''; \n\n if (icon) {\n html += ``;\n }\n \n html += `${message}`;\n\n if (!doNotShowRemove) {\n html += ``;\n }\n\n let content: HTMLDivElement = document.createElement('div');\n content.className = `toaster ${extraClass != null ? extraClass : ``} ${element != null ? `` : `toaster-fixed`} ${basketOpen ? `basket-open` : ``} ${MessageSeverity[severity]}`;\n content.setAttribute(\"data-container\", \"easy-toaster\");\n content.innerHTML = html;\n\n if (element) {\n element.append(content);\n } else {\n document.body.appendChild(content);\n }\n \n if (timeBeforeRemoved == null || timeBeforeRemoved > 0) {\n setTimeout(function () {\n document.querySelectorAll('[data-container=\"easy-toaster\"]')?.forEach(element =>\n element.remove()\n );\n }, timeBeforeRemoved || 3000);\n }\n\n return false;\n }\n\n static onRemoveToaster(e) {\n e.preventDefault();\n e.stopPropagation();\n\n var toaster = e.target.closest(\".toaster\") as HTMLElement;\n if(toaster)\n toaster.remove();\n\n return false;\n }\n}\n\nexport enum MessageSeverity {\n success,\n warning,\n error\n}","import { invoke } from '@shared/easyfy.decorators';\nimport { globalEvent } from '@shared/easyfy.core';\nimport { hide, hideAll } from '@shared/easyfy.utils';\nimport formService from '@inlineServices/form.service';\nimport easyfyToaster, { MessageSeverity } from '@shared/easyfy.toaster';\n\nnamespace Easyfy.Modules {\n @invoke\n class Form {\n constructor() {\n\n }\n\n onInit() {\n globalEvent({\n type: 'submit',\n event: {\n action: 'ajax-form',\n callback: Form.onPostForm\n }\n });\n\n globalEvent({\n type: 'submit',\n event: {\n action: 'pre-post',\n callback: Form.onPrePostAction\n }\n });\n }\n\n static onPostForm = async (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n const element: HTMLFormElement = e.target as HTMLFormElement;\n const data: FormData = new FormData(element);\n const dataUpdate = 'data-update';\n const dataHiddenValue = 'data-hidden-value';\n const datamessageContainer = element.attributes['data-message']?.value;\n const messageContainer = element.querySelector(`[data-container=\"${datamessageContainer}\"]`) as HTMLElement;\n\n formService.PostForm(element.attributes['action']?.value, data).then(response => {\n if (messageContainer) {\n easyfyToaster.toaster(response.data.success ? MessageSeverity.success : MessageSeverity.error, response.data.message, messageContainer);\n } else {\n easyfyToaster.toaster(response.data.success ? MessageSeverity.success : MessageSeverity.error, response.data.message);\n }\n\n if (response.data.success) {\n if (response.data.partial) {\n const updateContainer = element.attributes[dataUpdate]?.value;\n const container = document.querySelector(`[data-container=\"${updateContainer}\"]`);\n\n if (container) {\n container.innerHTML = response.data.partial;\n\n // clear field for next form load\n const hiddenValue = element.querySelector(`[${dataHiddenValue}]`)?.value;\n if (hiddenValue) {\n element.setAttribute(dataUpdate, element.attributes[dataUpdate].value.replace(`-${hiddenValue}`, ''));\n }\n }\n\n const extraToggleEvent = element.attributes['data-extra-toggle-event']?.value;\n if (extraToggleEvent) {\n const container = document.querySelector(`[data-container=\"${extraToggleEvent}\"]`);\n if (container) hide(container);\n\n const overlayElement: NodeListOf = document.querySelectorAll('[data-overlay-container]');\n hideAll(overlayElement);\n }\n } else if (response.data.reload) {\n setTimeout(function () {\n location.reload();\n }, 700);\n }\n }\n });\n\n return false;\n }\n\n static onPrePostAction = async (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n const form: HTMLFormElement = e.target as HTMLFormElement;\n const data: FormData = new FormData(form);\n const datamessageContainer = form.attributes['data-message']?.value;\n const messageContainer = form.querySelector(`[data-container=\"${datamessageContainer}\"]`) as HTMLElement;\n const validationMethod = form.attributes['data-validate-method']?.value;\n\n if (!validationMethod) return;\n\n formService.PostForm(validationMethod, data).then(response => {\n if (response.data.success) {\n form.submit();\n }\n else {\n if (messageContainer) {\n easyfyToaster.toaster(response.data.success ? MessageSeverity.success : MessageSeverity.error, response.data.message, messageContainer);\n } else {\n easyfyToaster.toaster(response.data.success ? MessageSeverity.success : MessageSeverity.error, response.data.message);\n }\n }\n });\n\n return false;\n }\n }\n}","import easyfyAxios from '@shared/easyfy.axios';\n\nnamespace Easyfy.Web.Services.Basket {\n export interface IBasket {\n rows: IBasketRow[];\n }\n\n export interface ITrackingData {\n listName: string,\n listId: string,\n searchProductOrigin: string\n }\n\n export interface IBasketRow {\n productId?: string;\n salesUnitCode?: string;\n rowId?: string;\n setQty?: number;\n changeQty?: number;\n trackingData?: ITrackingData;\n properties?: { [key: string]: string };\n purchaseType?: IPurchaseType;\n subscriptionOptions?: ISubscriptionOptions;\n }\n\n export interface BasketValidation {\n basketId: string;\n rowValidations: BasketRowValidation[];\n isValid: boolean;\n }\n\n export interface BasketRowValidation {\n basketRowId: string;\n errorCodes: string[];\n isValid: boolean;\n }\n\n export interface ISubscriptionOptions {\n optionId: string;\n qty?: number;\n }\n export enum IPurchaseType {\n OneTimePurchase,\n Subscription\n }\n\n export enum UpsellKey {\n UpsellId = 'Upsell.Id',\n UpsellCode = 'Upsell.Code',\n UpsellName = 'Upsell.Name',\n UpsellZone = 'Upsell.Zone',\n }\n\n export const UpdateBasket = async (data: IBasket, token: string): Promise => {\n return await easyfyAxios.post('/api/basket?handler=save', data, token);\n };\n\n export const GetBasket = async (): Promise => {\n return await easyfyAxios.get('/api/basket');\n }\n}\n\nexport default Easyfy.Web.Services.Basket;","export enum AddToCartState {\n Processing = \"processing\",\n Success = \"success\",\n Fail = \"fail\"\n}","import { addCss } from '@shared/easyfy.utils';\n\nexport const isMobile = () => (window.innerWidth <= 768 ? true : false);\n\nexport const isDesktop = () => (window.innerWidth >= 1100 ? true : false);\n\nexport const toggleProp = (el: HTMLElement): void => {\n !('open' in el.dataset) ? (el.dataset.open = '') : delete el.dataset.open;\n};\n\nexport const animationEnded = (el: Element | HTMLElement, func: EventListenerOrEventListenerObject) =>\n el.addEventListener('animationend', func, { once: true });\n\nexport const deleteCookie = (name: string) => {\n const expirationTime = Date.now() - 30 * 60 * 1000;\n document.cookie = `${name}= ; expires=${new Date(expirationTime).toUTCString()}; path=/; domain=${window.location.hostname}`;\n};\n\nexport const setCookie = (contentCookie: string, cookieName: string, expirationDate?: Date) => {\n deleteCookie(cookieName);\n\n const expiration = expirationDate || new Date();\n\n if (!expirationDate) {\n expiration.setTime(expiration.getTime() + 30 * 60 * 1000); // default to 30 minutes\n }\n\n document.cookie = `${cookieName}=${contentCookie}; expires=\"${expiration.toUTCString()}\"; path=/; domain=${window.location.hostname}`;\n};\n\nexport const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport const clearContent = (container) => {\n container.innerHTML = '';\n};\n\nexport const replaceContent = (container, data: string, type: string = 'append', clearData: boolean = true) => {\n if (clearData) container.innerHTML = '';\n\n const content = document.createRange().createContextualFragment(data).firstElementChild;\n\n switch (type) {\n case 'after':\n container.after(content);\n break;\n case 'replaceInnerHtml':\n container.innerHTML = content.innerHTML;\n break;\n case 'append':\n default:\n container.appendChild(content);\n break;\n }\n};\n\nexport const createElementWithClasses = (tag: string, classes: string | string[], innerText?: string | undefined): HTMLElement => {\n const element = document.createElement(tag);\n addCss(element, classes);\n\n if (innerText) element.innerText = innerText;\n return element;\n};\n\nexport const createLink = (href: string | undefined, text: string, classes: string | string[]): HTMLAnchorElement => {\n const link = document.createElement('a');\n link.href = href || '#';\n link.innerText = text;\n addCss(link, classes);\n return link;\n};\n\nexport const createEventButton = (text: string, event: string, classes: string | string[]): HTMLButtonElement => {\n const button = document.createElement('button');\n button.innerText = text;\n button.dataset.event = event;\n addCss(button, classes);\n return button;\n};\n\nexport interface UrlHistoryContent {\n appendType: string;\n data: string;\n}\n","import { globalEvent } from '@shared/easyfy.core';\nimport { addCss } from '@shared/easyfy.utils';\nexport class SnackBar {\n constructor() {\n globalEvent({\n type: 'click',\n events: [\n {\n event: 'close-snackbar',\n callback: this.onToggleElement,\n },\n ],\n });\n }\n\n private onToggleElement(e: Event) {\n const element: HTMLElement = e.target as HTMLElement;\n const snackbar = element?.closest('.snackbar');\n snackbar?.remove();\n }\n\n static appendSnackbar = (severity?: SnackbarSeverity, message?: string, icon?: string) => {\n const snackBarMessage = message ?? 'An error has occured, try to refresh the page.';\n const snackbarSeverity = severity ?? SnackbarSeverity.error;\n const snackBarIcon = icon ?? 'icon-warning-severe';\n\n let element = document.createElement('div');\n addCss(element, 'snackbar');\n addCss(element, `snackbar-${SnackbarSeverity[snackbarSeverity]}`);\n\n let html = `
\n \n
\n ${snackBarMessage}\n
\n
\n `;\n\n element.innerHTML = html;\n\n document.body.appendChild(element);\n\n setTimeout(() => {\n element.remove();\n }, 7000);\n };\n}\n\nexport enum SnackbarSeverity {\n success,\n warning,\n error,\n}\n","export interface IPriceDetails {\n rowPriceInVat: number;\n unitPrice: number;\n packSize: number;\n}\n\nexport default class PriceHelper {\n static getPriceDetails = (basketRow: Element): IPriceDetails => {\n const rowPriceElement: HTMLElement = basketRow.querySelector('[data-rowpriceincvat]') as HTMLElement;\n const unitPriceElement: HTMLElement = basketRow.querySelector('[data-unitprice]') as HTMLElement;\n const packSizeElement: HTMLElement = basketRow.querySelector('[data-packsize]') as HTMLElement;\n\n const rowPriceInVat: string | null = rowPriceElement?.getAttribute('data-rowpriceincvat');\n const unitPrice: string | null = unitPriceElement?.getAttribute('data-unitprice');\n const packSize: string | null = packSizeElement?.getAttribute('data-packsize');\n\n const rp: number = this.parseCurrencyToFloat(rowPriceInVat);\n const up: number = this.parseCurrencyToFloat(unitPrice);\n const ps: number = this.parseCurrencyToFloat(packSize);\n\n return {\n rowPriceInVat: rp,\n unitPrice: up,\n packSize: ps,\n };\n };\n\n static calculateNewRowPriceInVat(basketRow: Element, qty: number): number {\n const { unitPrice, packSize } = this.getPriceDetails(basketRow);\n let pricePerQty = unitPrice * packSize;\n let newRowPriceInVat = pricePerQty * qty;\n\n return newRowPriceInVat;\n }\n\n static updateAndFormatPrice(input: string, newPrice: number, locale: string): string {\n const regex = /^(\\D*)(\\s?)([\\d,.,\\s]+?)(\\s?)(\\D*)$/;\n\n const match = input.match(regex);\n if (!match) {\n console.log('Invalid price format');\n return input;\n }\n\n // eslint-disable-next-line\n const [_, prefixSymbol, spaceBefore, originalPrice, spaceAfter, suffixSymbol] = match;\n\n // Use the provided locale to format the price\n const formatter = new Intl.NumberFormat(locale, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n\n const formattedPrice = formatter.format(newPrice);\n\n // Reassemble based on symbol placement\n if (suffixSymbol) {\n return `${formattedPrice}${spaceAfter}${suffixSymbol}`; // Add space after the price if it exists\n } else {\n return `${prefixSymbol}${spaceBefore}${formattedPrice}`; // Retain space before price if it exists\n }\n }\n\n private static parseCurrencyToFloat = (currencyString: string | null): number => {\n if (currencyString === null) return 0;\n const numericPart = currencyString.replace(/[^\\d,.-]/g, '').replace(',', '.');\n return parseFloat(numericPart);\n };\n}\n","import { element, elementsOf, globalEvent } from '@shared/easyfy.core';\nimport { invoke } from '@shared/easyfy.decorators';\nimport { addCss, hide, removeCss, show } from '@shared/easyfy.utils';\nimport basketService from '@webServices/basket.service';\nimport { AddToCartState } from '@shared/easyfy.enums';\nimport { animationEnded } from '@clientShared/utils';\nimport easyfyToaster, { MessageSeverity } from '@shared/easyfy.toaster';\nimport { SnackBar, SnackbarSeverity } from '@clientWebModules/snackbar';\nimport PriceHelper from '@clientShared/priceHelper';\n\n@invoke\nexport default class Basket {\n static Instance: Basket;\n constructor() {\n Basket.Instance = this;\n globalEvent({\n type: 'click',\n events: [\n {\n action: 'add-to-cart',\n callback: this.onAddToCart,\n },\n {\n action: 'basketrow-change',\n callback: this.onBasketRowChange,\n },\n {\n action: 'basketrow-remove',\n callback: this.onBasketRowRemove,\n },\n {\n action: 'decrease-quantity',\n callback: this.onDecreaseQuantity,\n },\n {\n action: 'increase-quantity',\n callback: this.onIncreaseQuantity,\n },\n ],\n });\n\n globalEvent({\n type: 'change',\n event: {\n action: 'basketrow-set',\n callback: this.onBasketRowSet,\n },\n });\n }\n\n onInit() {}\n\n onAddToCart = async (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n const el: HTMLElement = e.target as HTMLElement;\n let quantity: number = 1;\n\n /* Change element state to 'processing'. */\n el.dataset.state = AddToCartState.Processing;\n el.setAttribute('disabled', 'disabled');\n\n if (el.querySelectorAll('.state').length === 0) {\n el.appendChild(document.createElement('div')).classList.add('state');\n }\n\n if (el.dataset.quantityInput) {\n const quantityInput = document.querySelector(el.dataset.quantityInput) as HTMLInputElement;\n if (quantityInput) {\n quantity = parseInt(quantityInput.value);\n }\n }\n\n const headerBasket: HTMLElement = element('[data-container=\"header-basket\"]') as HTMLElement;\n const hasSubscription = el.dataset?.optionid != null;\n const searchProductId = el.dataset?.searchproductid;\n let properties: { [key: string]: string } = null;\n if (el.dataset?.upsellid)\n properties = {\n [basketService.UpsellKey.UpsellId]: el.dataset?.upsellid,\n };\n\n await basketService\n .UpdateBasket(\n {\n rows: [\n {\n productId: el.dataset?.productid,\n salesUnitCode: el.dataset?.salesunitcode,\n changeQty: quantity,\n trackingData: {\n listName: el?.dataset.originatedFromListName,\n listId: el?.dataset.originatedFromListId,\n searchProductOrigin: searchProductId,\n },\n subscriptionOptions: {\n optionId: el?.dataset?.optionid,\n },\n properties: properties,\n },\n ],\n },\n el.dataset?.token\n )\n .then((response) => {\n Basket.Instance.renderBasket(response);\n if (response?.data?.message) {\n /*Default is error/fail.*/\n let elementState = AddToCartState.Fail;\n if (response.data.success === true) {\n elementState = AddToCartState.Success;\n if (hasSubscription) {\n this.updateSubscriptionFlyout(searchProductId);\n }\n\n addCss(headerBasket, 'bounce');\n animationEnded(headerBasket, () => {\n removeCss(headerBasket, 'bounce');\n });\n } else {\n SnackBar.appendSnackbar(SnackbarSeverity.error, response.data.message);\n }\n el.dataset.state = elementState;\n }\n })\n .catch(() => {\n /* Change element state to 'Fail'. */\n el.dataset.state = AddToCartState.Fail;\n });\n\n el.removeAttribute('disabled');\n\n /* Remove element state. */\n setTimeout(() => {\n el.removeAttribute('data-state');\n el.querySelector('.state').remove();\n }, 2000);\n\n const quantityElement: HTMLElement = headerBasket.querySelector('[data-container=\"basket-quantity\"]') as HTMLElement;\n if (quantityElement.innerText === '1' && el.dataset.state != AddToCartState.Fail) {\n (document.querySelector('[dd-open] [data-event=\"dd-close\"]:not(.hidden-sm)') as HTMLElement)?.click();\n setTimeout(() => {\n headerBasket.click();\n }, 200);\n }\n\n return false;\n };\n\n onBasketRowChange = async (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n const element: HTMLElement = e.target as HTMLElement;\n const basketButtons = element?.closest('[data-container=\"basket-buttons\"') as HTMLElement;\n\n const rowId = basketButtons?.dataset?.rowid;\n const quantity = element.dataset?.add != null ? 1 : -1;\n const subscriptionOptionId = basketButtons.dataset?.subscriptionoptionid;\n await basketService\n .UpdateBasket(\n {\n rows: [\n {\n rowId: rowId,\n changeQty: quantity,\n subscriptionOptions: {\n optionId: subscriptionOptionId,\n },\n trackingData: {\n listName: basketButtons.dataset?.originatedFromListName,\n listId: basketButtons.dataset?.originatedFromListId,\n searchProductOrigin: basketButtons.dataset?.searchproductid,\n },\n },\n ],\n },\n basketButtons?.dataset['token']\n )\n .then((response) => {\n Basket.Instance.renderBasket(response);\n if (response?.data?.message && !response.data.success) {\n easyfyToaster.toaster(MessageSeverity.error, response.data.message, null, 3000, null, null, null, true);\n }\n })\n .catch(() => {});\n\n return false;\n };\n\n onBasketRowSet = async (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n const element: HTMLInputElement = e.target as HTMLInputElement;\n const basketButtons = element?.closest('[data-container=\"basket-buttons\"') as HTMLElement;\n const rowId = basketButtons?.dataset?.rowid;\n const quantity: number = parseInt(element.value);\n const subscriptionOptionId = basketButtons.dataset?.subscriptionoptionid;\n\n await basketService\n .UpdateBasket(\n {\n rows: [\n {\n rowId: rowId,\n setQty: quantity,\n subscriptionOptions: {\n optionId: subscriptionOptionId,\n },\n trackingData: {\n listName: basketButtons.dataset?.originatedFromListName,\n listId: basketButtons.dataset?.originatedFromListId,\n searchProductOrigin: basketButtons.dataset?.searchproductid,\n },\n },\n ],\n },\n basketButtons?.dataset.token\n )\n .then((response) => {\n Basket.Instance.renderBasket(response);\n })\n .catch(() => {});\n\n return false;\n };\n\n onBasketRowRemove = async (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n const element: HTMLElement = e.target as HTMLElement;\n const basketButtons = element?.closest('[data-container=\"basket-buttons\"') as HTMLElement;\n\n await basketService\n .UpdateBasket(\n {\n rows: [\n {\n rowId: basketButtons?.dataset?.rowid,\n setQty: 0,\n trackingData: {\n listName: basketButtons.dataset?.originatedFromListName,\n listId: basketButtons.dataset?.originatedFromListId,\n searchProductOrigin: basketButtons.dataset?.searchproductid,\n },\n },\n ],\n },\n basketButtons.dataset.token\n )\n .then((response) => {\n Basket.Instance.renderBasket(response);\n })\n .catch(() => {});\n\n return false;\n };\n\n onDecreaseQuantity() {\n Basket.Instance.changeQuantity(false);\n return false;\n }\n\n onIncreaseQuantity() {\n Basket.Instance.changeQuantity(true);\n return false;\n }\n\n static getBasket = async () => {\n await basketService\n .GetBasket()\n .then((response) => {\n Basket.Instance.renderBasket(response);\n })\n .catch(() => {});\n\n return false;\n };\n\n renderBasket = (response: any) => {\n if (response?.status == 200 && response?.data != null) {\n const basketContentEl: HTMLElement = element('.basket-content') as HTMLElement;\n const scrollPos = basketContentEl.scrollTop;\n const headerBasket: HTMLElement = element('[data-container=\"header-basket\"]') as HTMLElement;\n const miniBasket: HTMLElement = element('[data-container=\"mini-basket\"]') as HTMLElement;\n const priceElement: HTMLElement = headerBasket.querySelector('[data-container=\"basket-price\"]') as HTMLElement;\n const quantityElement: HTMLElement = headerBasket.querySelector('[data-container=\"basket-quantity\"]') as HTMLElement;\n const headerCheckout: HTMLElement = document.querySelector('[data-container=\"header-checkout\"]') as HTMLElement;\n\n if (response?.data?.totalQuantity > 0) {\n if (priceElement) {\n priceElement.innerHTML = response?.data?.prices?.priceIncVatExclDiscountExclShipping;\n //show(priceElement);\n }\n\n if (quantityElement) {\n quantityElement.innerHTML = response?.data?.totalQuantity;\n show(quantityElement, 'flex');\n }\n if (headerCheckout) {\n headerCheckout.removeAttribute('disabled');\n }\n } else {\n if (quantityElement) {\n hide(quantityElement);\n }\n\n if (priceElement) {\n //hide(priceElement);\n priceElement.innerHTML = priceElement.dataset.basketText;\n }\n\n if (headerCheckout) {\n headerCheckout.setAttribute('disabled', 'disabled');\n }\n }\n\n if (miniBasket && response?.data?.success === true) {\n miniBasket.innerHTML = response.data.partial;\n\n const basketContentElNew: HTMLElement = element('.basket-content') as HTMLElement;\n if (scrollPos > 0 && basketContentElNew.scrollTop != scrollPos) {\n basketContentElNew.scrollTo(0, scrollPos);\n }\n }\n }\n\n return false;\n };\n\n private changeQuantity = (increase: boolean) => {\n const parentContainer = element('[data-container=\"page\"]');\n const quantityInput = elementsOf(parentContainer, '#quantity') as HTMLInputElement;\n const priceElement: HTMLElement = elementsOf(parentContainer, '.pp-actions .price') as HTMLElement;\n const price = priceElement?.getAttribute('data-sales-price');\n const unitPrice = parseFloat(price?.replace(',', '.'));\n const locale = document?.documentElement.getAttribute('data-culture');\n\n let quantity = 0;\n\n if (quantityInput) {\n if (increase) {\n quantityInput.stepUp();\n } else {\n quantityInput.stepDown();\n }\n quantity = +quantityInput.value;\n }\n\n if (priceElement && unitPrice && quantity) {\n const newPrice = PriceHelper.updateAndFormatPrice(priceElement.innerText, unitPrice * quantity, locale);\n if (newPrice) {\n priceElement.innerText = newPrice;\n }\n }\n\n return false;\n };\n\n private updateSubscriptionFlyout = (productId: string) => {\n const flyoutCloseBtn = element(`[data-target=\"product-options-selector-subscription-${productId}\"]`) as HTMLElement;\n flyoutCloseBtn?.click();\n\n const freqSelector = element('[data-container=\"subscription-freq\"]') as HTMLElement;\n const updateFreqFlyout = freqSelector?.dataset?.updateflyout;\n\n if (updateFreqFlyout && updateFreqFlyout.toLowerCase() == 'true') {\n const updateFlyoutEvent = new CustomEvent('update-subs-flyout', { bubbles: true, cancelable: false });\n document.dispatchEvent(updateFlyoutEvent);\n }\n };\n}\n","import easyfyAxios from '@shared/easyfy.axios';\n\nexport const GetLoginFlyout = async (): Promise => {\n return await easyfyAxios.get('/api/loginflyout');\n};\n","// exemple\n// element('.about'); //
\n// element('[data-action=\"top-nav\"]'); //
\n//export const element = (query: string) => document.querySelector(query);\nexport const element = (query: string) => document.querySelector(query);\n\nexport const elements = (query: string) => document.querySelectorAll(query);\n\nexport const elementsOf = (element: Element | HTMLElement, query: string) => element.querySelector(query);\n\n// exemple\n// elementContains(document.querySelector('head'), document.querySelector('title')); // true\n// elementContains(document.querySelector('body'), document.querySelector('body')); // false\nexport const elementContains = (parent: Element, child: Element) => parent !== child && parent.contains(child);\n\nexport const on = (action: string | Element, type: string, callback: Function, ref?: object, meta?: object) => {\n docReady(() => {\n type.split(' ').forEach(function (t) {\n (action instanceof Element ? action : element(action)).addEventListener(\n t,\n (e) => {\n try {\n callback.call(e.target, e, ref ?? null, meta ?? null);\n } catch (err) { }\n },\n { once: false, passive: true }\n );\n });\n });\n};\n\nexport const one = (action: string | Element, type: string, callback: Function) => {\n docReady(() => {\n type.split(' ').forEach(function (e) {\n (action instanceof Element ? action : element(action)).addEventListener(e, callback, { once: true });\n });\n });\n};\n\nexport const event = (action: string, type: string, callback: EventListener | EventListenerObject) => {\n docReady(() => {\n element(`[data-event=\"${action}\"]`)?.addEventListener(type, callback, false);\n });\n};\n\nexport const events = (action: string, type: string, callback: EventListener | EventListenerObject) => {\n docReady(() => {\n elements(`[data-event=\"${action}\"]`)?.forEach((item) => {\n item.addEventListener(type, callback, false);\n });\n });\n};\n\nexport const action = (action: string, type: string, callback: EventListener | EventListenerObject) => {\n docReady(() => {\n element(`[data-action=\"${action}\"]`)?.addEventListener(type, callback, false);\n });\n};\n\nexport const actions = (action: string, type: string, callback: EventListener | EventListenerObject | Function) => {\n docReady(() => {\n elements(`[data-action=\"${action}\"]`)?.forEach((el) => el?.addEventListener(type, callback, false));\n });\n};\n\nexport const bind = (action: string, type: string, callback: EventListener | EventListenerObject) => {\n docReady(() => {\n elements(action || '')?.forEach((item) => {\n type.split(' ').forEach(t => {\n item.addEventListener(t, callback, false);\n });\n });\n });\n};\n\nexport const off = (action: string | Element | HTMLElement | Array, type: string, callback: EventListener | EventListenerObject) => {\n if (action instanceof String || action instanceof Element || action instanceof HTMLElement) {\n (action instanceof Element || action instanceof HTMLElement ? action : element(action)).removeEventListener(type, callback, false);\n }\n\n if (action instanceof Array) {\n for (let x of action) {\n let item: any = x;\n (item instanceof Element || item instanceof HTMLElement ? item : element(item)).removeEventListener(type, callback, false);\n }\n }\n};\n\nexport const offAll = (action: string, type: string, callback: EventListener | EventListenerObject) => {\n elements(action).forEach((item) => {\n item.removeEventListener(type, callback, false);\n });\n};\n\nexport interface IEventChain {\n target: string;\n type: string;\n events: Array;\n}\n\nexport interface IEventChainItem {\n action?: string;\n event?: string;\n callback?: Function;\n}\n\nexport const eventChain = (arg: IEventChain) => {\n bind(arg.target, arg.type, (e) => {\n const target: any = e.target;\n let eventTarget = target?.attributes['data-action']?.value ?? target?.attributes['data-event']?.value;\n\n if (!eventTarget) eventTarget = target.parentNode?.attributes['data-action']?.value ?? target.parentNode?.attributes['data-event']?.value;\n\n if (!eventTarget) return;\n\n const item: any = arg.events.find(({ action, event }) => (action ?? event).includes(eventTarget));\n if (item?.callback) item.callback(e);\n });\n};\n\nexport const getBlazorEditMode = () => {\n if (!window.isAdminModeEnabled) {\n return false;\n }\n if (window.isEditModeEnabled !== undefined) {\n // Return value to avoid parsing cookies constantly\n return window.isEditModeEnabled;\n }\n const cookies = document.cookie.split(\";\");\n const editModeCookie = cookies.find(cookie => cookie.trim().startsWith(\"_AdminEditMode\"));\n window.isEditModeEnabled = editModeCookie?.split(\"=\")[1].toLowerCase() === \"true\";\n return window.isEditModeEnabled;\n}\n\n\n// Need to wait for blazor\n\nexport const docReady = (callback?: Function, context?: Object | string | number | boolean) => {\n\n let blazorFinishedLoadingEventRegistered: boolean = true;\n\n // Method to trigger window events\n if (!window.EasyfyMethods) {\n window.EasyfyMethods = {};\n window.EasyfyMethods.triggerWindowEvent = (eventName, eventData) => {\n if (eventName) {\n let event = new CustomEvent(eventName, {\n detail: eventData\n });\n window.dispatchEvent(event);\n }\n }\n }\n\n if (getBlazorEditMode()) {\n blazorFinishedLoadingEventRegistered = false;\n }\n\n // The public function name defaults to window.docReady\n // but you can pass in your own object and own function name and those will be used\n // if you want to put them in a different namespace\n // funcName = funcName || \"docReady\";\n // baseObj = baseObj || window;\n let readyList = [];\n let readyFired = false;\n let readyEventHandlersInstalled = false;\n\n // call this when the document is ready\n // this function protects itself against being called more than once\n const ready = () => {\n const readyBody = () => {\n if (!readyFired) {\n // this must be set to true before we start calling callbacks\n readyFired = true;\n for (var i = 0; i < readyList.length; i++) {\n // if a callback here happens to add new ready handlers,\n // the docReady() function will see that it already fired\n // and will schedule the callback to run right after\n // this event loop finishes so all handlers will still execute\n // in order and no new ones will be added to the readyList\n // while we are processing the list\n readyList[i].fn.call(window, readyList[i].ctx);\n // allow any closures held by these functions to free\n }\n readyList = [];\n }\n }\n if (getBlazorEditMode() && !window.blazorFinishedLoading) {\n if (!blazorFinishedLoadingEventRegistered) {\n blazorFinishedLoadingEventRegistered = true;\n window.addEventListener('blazorFinishedLoading', () => {\n window.blazorFinishedLoading = true;\n readyBody();\n }, false);\n }\n }\n else {\n readyBody();\n }\n\n };\n\n const readyStateChange = () => {\n if (document.readyState === 'complete') {\n ready();\n }\n };\n\n // This is the one public interface\n // docReady(fn, context);\n // the context argument is optional - if present, it will be passed\n // as an argument to the callback\n\n if (typeof callback !== 'function') {\n throw new TypeError('callback for docReady(fn) must be a function');\n }\n // if ready has already fired, then just schedule the callback\n // to fire asynchronously, but right away\n if (readyFired) {\n setTimeout(function () {\n callback(context);\n }, 1);\n return;\n } else {\n // add the function and context to the list\n readyList.push({ fn: callback, ctx: context });\n }\n // if document already ready to go, schedule the ready function to run\n if (document.readyState === 'complete') {\n setTimeout(ready, 1);\n } else if (!readyEventHandlersInstalled) {\n // otherwise if we don't have event handlers installed, install them\n if (document.addEventListener) {\n // first choice is DOMContentLoaded event\n document.addEventListener('DOMContentLoaded', ready, false);\n // backup is window load event\n window.addEventListener('load', ready, false);\n }\n readyEventHandlersInstalled = true;\n }\n};\n\nexport interface IEvent {\n type: string;\n event?: IEventItem;\n events?: Array;\n}\n\nexport interface IEventItem {\n action?: string;\n event?: string;\n callback?: Function;\n}\n\ninterface IGlobalEventItem {\n type: string;\n action?: string;\n event?: string;\n callback?: Array;\n}\n\n// Global event\nexport let globalEventList: Array = [];\n\nexport const globalEvent = (event: IEvent) => {\n event.type.split(' ').forEach((type) => {\n if (event.event) event.events = [...(event.events ?? []), ...[event.event]];\n\n if (event.events) {\n for (let item of event.events) {\n let foundItem;\n\n if (item?.action) {\n let actionFound: IGlobalEventItem = globalFindAction(type, item?.action);\n if (actionFound) {\n foundItem = actionFound;\n }\n }\n\n if (item?.event) {\n let eventFound: IGlobalEventItem = globalFindEvent(type, item?.event);\n if (eventFound) {\n foundItem = eventFound;\n }\n }\n\n if (!item?.event && !item?.action) {\n // check global state.\n let globalFound: IGlobalEventItem = globalFind(type);\n if (globalFound) {\n foundItem = globalFound;\n }\n }\n\n foundItem ? foundItem.callback.push(item.callback) : globalEventAdd(type, item);\n }\n }\n\n document.body.removeEventListener(type, globalEventHandler);\n document.body.addEventListener(type, globalEventHandler);\n });\n};\n\nexport const debounce = (func, wait) => {\n let timeout;\n\n return function executedFunction(...args) {\n const later = () => {\n clearTimeout(timeout);\n func(...args);\n };\n\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n};\n\nconst globalEventHandler = (e) => {\n const target: any = e.target;\n\n // check action\n let eventTarget = globalGetTargetAction(target);\n if (eventTarget) {\n const item: IGlobalEventItem = globalFindAction(e.type, eventTarget);\n if (item?.callback) {\n globalEventInvokeCallback(item?.callback, e);\n }\n return;\n }\n\n // check event\n eventTarget = globalGetTargetEvent(target);\n if (eventTarget) {\n const item: IGlobalEventItem = globalFindEvent(e.type, eventTarget);\n if (item?.callback) {\n globalEventInvokeCallback(item?.callback, e);\n }\n return;\n }\n\n // check event\n const item = globalMatchType(e.type);\n if (item?.callback) {\n globalEventInvokeCallback(item?.callback, e);\n return;\n }\n};\n\nconst globalEventInvokeCallback = (cbs: Array, e: any) => {\n for (let item of cbs) {\n item?.call(null, e);\n }\n};\n\nconst globalEventAdd = (type: string, item: IEventItem): void => {\n globalEventList.push({\n type: type,\n action: item?.action,\n event: item?.event,\n callback: [item?.callback],\n });\n};\n\nconst globalFind = (itemType: string): IGlobalEventItem => {\n return globalEventList.find(({ type, action, event }) => type === itemType && !action && !event);\n};\n\nconst globalFindEvent = (itemType: string, eventType: string): IGlobalEventItem => globalEventList.find(({ type, event }) => type === itemType && (event ?? '') === (eventType ?? ''));\n\nconst globalFindAction = (itemType: string, actionType: string): IGlobalEventItem => globalEventList.find(({ type, action }) => type === itemType && (action ?? '') === (actionType ?? ''));\n\nconst globalMatchType = (itemType: string): IGlobalEventItem => globalEventList.find(({ type, action, event }) => type === itemType && !action && !event);\n\nconst globalGetTargetAction = (target) => globalGetTarget(target, 'data-action');\n\nconst globalGetTargetEvent = (target) => globalGetTarget(target, 'data-event');\n\nconst globalGetTarget = (target, dataTarget: string) => {\n let eventTarget = target?.attributes[dataTarget]?.value;\n if (!eventTarget) eventTarget = target.parentNode?.attributes[dataTarget]?.value;\n return eventTarget;\n};","import { invoke } from '@shared/easyfy.decorators';\nimport { element } from '../../../../../Easyfy.Commerce/Easyfy.Commerce.Presentation/ClientApp/shared/scripts/easyfy.core';\n\n@invoke\nexport class BreadCrumb {\n static Instance: BreadCrumb;\n private breadCrumbs: HTMLElement = element('.breadcrumbs');\n private breadCrumbBlurbox: HTMLElement = element('.breadcrumb-blurbox-container');\n\n constructor() {\n BreadCrumb.Instance = this;\n }\n\n onInit() {\n BreadCrumb.Instance.breadCrumbs?.addEventListener('scrollend', this.handleScrollEvent);\n }\n\n private handleScrollEvent() {\n let scrollLocation = Math.round(BreadCrumb.Instance.breadCrumbs.scrollLeft);\n let scrollDiff = BreadCrumb.Instance.breadCrumbs.clientWidth - BreadCrumb.Instance.breadCrumbs.scrollWidth;\n\n if (0 <= scrollLocation - scrollDiff && scrollLocation - scrollDiff <= 1) {\n BreadCrumb.Instance.breadCrumbBlurbox.style.setProperty('--show-left-blur', 'none');\n } else {\n BreadCrumb.Instance.breadCrumbBlurbox.style.setProperty('--show-left-blur', 'block');\n }\n }\n}\n","import { invoke } from '@shared/easyfy.decorators';\nimport { addCss, removeCss } from '@shared/easyfy.utils';\nimport { globalEvent } from '@shared/easyfy.core';\n\n@invoke\nexport default class Menu {\n static Instance: Menu;\n private activeMenu: HTMLElement = document.querySelector('.mm-active .nav-list');\n private navHeader: HTMLElement = document.querySelector('.mm-active .nav-header');\n\n constructor() {\n Menu.Instance = this;\n }\n\n onInit() {\n globalEvent({\n type: 'click',\n events: [\n {\n event: 'toggle-menu-children',\n callback: this.toggleMenuChildren,\n },\n {\n event: 'menu-goback',\n callback: this.menuGoBack,\n },\n {\n event: 'scroll-main-nav',\n callback: this.scrollMainNav,\n },\n ],\n });\n\n this.updateMenuStyle();\n }\n\n private updateMenuStyle() {\n const navList = document.querySelector('[data-container=\"nav-list\"]') as HTMLElement;\n const navItems = document.querySelectorAll('.menu-item.level-1');\n const LINE_BREAK_CLASS_NAME = 'line-break';\n let updated = false;\n navItems?.forEach((navItem) => {\n var itemEl = navItem as HTMLElement;\n if (!updated && itemEl.offsetTop > navList.offsetTop) {\n navItem.classList.add(LINE_BREAK_CLASS_NAME);\n updated = true;\n }\n });\n }\n\n private scrollMainNav = (e) => {\n var element = e.target as HTMLElement;\n\n if (!element.hasAttribute('data-target')) element = element.parentElement;\n\n const scrollNumber: number = 200;\n const target = element.attributes['data-target']?.value;\n const direction = element.attributes['data-scroll-direction']?.value;\n const container = document.querySelector(`[data-container=\"${target}\"`);\n const scrollRight = direction == 'right';\n\n const leftArrow: HTMLElement = document.querySelector('[data-event=\"scroll-main-nav\"][data-scroll-direction=\"left\"]');\n const rightArrow: HTMLElement = document.querySelector('[data-event=\"scroll-main-nav\"][data-scroll-direction=\"right\"]');\n\n var scroll: number = scrollRight ? scrollNumber : -scrollNumber;\n var scrollPosition: number = container.scrollLeft + scroll;\n const scrollWidth: number = container.scrollWidth;\n const leftToScroll: number = scrollWidth - (scrollPosition + container.clientWidth);\n\n const VISIBLE_CLASS_NAME = 'visible';\n\n if (scrollRight && leftToScroll < scroll) {\n scroll += leftToScroll;\n scrollPosition += leftToScroll;\n } else if (!scrollRight && scrollPosition < leftToScroll) {\n scroll -= leftToScroll;\n scrollPosition -= leftToScroll;\n }\n\n container.scrollBy({\n left: scroll,\n behavior: 'smooth',\n });\n\n if (scrollPosition <= 0) {\n removeCss(leftArrow, VISIBLE_CLASS_NAME);\n } else {\n addCss(leftArrow, VISIBLE_CLASS_NAME);\n }\n\n if (scrollWidth <= scrollPosition + container.clientWidth) {\n removeCss(rightArrow, VISIBLE_CLASS_NAME);\n } else {\n addCss(rightArrow, VISIBLE_CLASS_NAME);\n }\n\n return false;\n };\n\n private toggleMenuChildren = (e) => {\n e.preventDefault();\n e.stopPropagation();\n const element = e.target as HTMLElement;\n\n if (element.dataset.target != null) {\n Menu.addBreadCrumbMenuItem(element.innerText);\n\n const childElement = document.querySelector(`[data-container=\"${element.dataset.target}\"`);\n\n if (childElement) {\n Menu.updateMenuBreadcrumbs();\n\n const activeElement = document.querySelector('.mm-active');\n removeCss(activeElement, 'mm-active');\n addCss(activeElement, 'mm-visited');\n addCss(childElement, 'mm-active');\n\n this.registerMenuScroll();\n }\n }\n };\n\n private menuGoBack = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n const element = e.target as HTMLElement;\n const container = element?.closest('.mm-active');\n const parent = element?.closest('.mm-visited');\n\n if (container) {\n removeCss(container, 'mm-active');\n Menu.removeBreadCrumbLastMenuItem();\n Menu.updateMenuBreadcrumbs();\n }\n\n if (parent) {\n removeCss(parent, 'mm-visited');\n addCss(parent, 'mm-active');\n }\n };\n\n private registerMenuScroll() {\n // unregister event scroll\n this.activeMenu?.removeEventListener('scroll', this.determineShadowLocation);\n\n // get active menu element\n this.activeMenu = document.querySelector('.mm-active .nav-list');\n this.navHeader = document.querySelector('.mm-active .nav-header');\n\n if (!this.activeMenu || !this.navHeader) return;\n\n const height = window.innerHeight - this.navHeader.offsetHeight;\n\n //no scroll needed\n if (this.activeMenu.scrollHeight <= height) return;\n\n this.activeMenu.style.setProperty('--header-height', `${this.navHeader.offsetHeight}px`);\n\n this.activeMenu.addEventListener('scroll', this.determineShadowLocation.bind(this), { passive: true });\n this.determineShadowLocation();\n }\n\n private determineShadowLocation = () => {\n if (this.activeMenu.scrollHeight - this.activeMenu.scrollTop < this.activeMenu.clientHeight + 10) {\n //scrolled all the way down\n removeCss(this.activeMenu, 'bottom');\n } else if (this.activeMenu.scrollTop > 0) {\n //scrolling\n addCss(this.activeMenu, ['bottom', 'top']);\n } else {\n //scrolled all the way up\n removeCss(this.activeMenu, 'top');\n }\n };\n\n private savedBreadcrumbsList: string[] = [];\n\n public static updateMenuBreadcrumbs = () => {\n const breadcrumbContainers = document.querySelectorAll('[data-container=\"menu-breadcrumbs\"]');\n\n breadcrumbContainers?.forEach((el) => {\n el.innerHTML = '';\n Menu.Instance.savedBreadcrumbsList.forEach((menuItem, index) => {\n const isLast = index === Menu.Instance.savedBreadcrumbsList.length - 1;\n const spanElement = document.createElement('span');\n\n spanElement.textContent = menuItem;\n\n if (!isLast) {\n const chevronElement = document.createElement('i');\n chevronElement.className = 'icon icon-chevron-right size-xs clr-arrow';\n el.appendChild(spanElement);\n el.appendChild(chevronElement);\n } else {\n el.appendChild(spanElement);\n }\n });\n });\n };\n\n public static addBreadCrumbMenuItem = (menu: string) => {\n Menu.Instance.savedBreadcrumbsList.push(menu);\n };\n\n public static removeBreadCrumbLastMenuItem = () => {\n if (Menu.Instance.savedBreadcrumbsList.length > 0) Menu.Instance.savedBreadcrumbsList.pop();\n };\n}\n","import { globalEvent } from '@shared/easyfy.core';\nimport { invoke } from '@shared/easyfy.decorators';\nimport { hasClass, removeCss, toggleClass } from '@shared/easyfy.utils';\n\n@invoke\nexport default class CountrySelector {\n private cssClass: string = 'expanded';\n private countryList: HTMLElement;\n\n constructor() {}\n onInit() {\n globalEvent({\n type: 'click',\n events: [\n {\n event: 'toggle-countries',\n callback: this.showCountries,\n },\n ],\n });\n }\n\n showCountries = (e: Event) => {\n e.stopPropagation();\n\n const target = e.target as HTMLElement;\n this.countryList = target.parentElement?.querySelector('[data-container=\"country-list\"]');\n if (!this.countryList) return;\n\n toggleClass(this.countryList, this.cssClass);\n\n if (hasClass(this.countryList, this.cssClass)) {\n document.addEventListener('click', this.closeOnEvent);\n document.addEventListener('scroll', this.closeOnEvent);\n }\n };\n\n closeOnEvent = (e: Event) => {\n const target = e.target as HTMLElement;\n\n if (e.type === 'click' && this.countryList.contains(target)) return;\n\n removeCss(this.countryList, this.cssClass);\n this.countryList = null;\n this.removeEventListeners();\n };\n\n removeEventListeners = () => {\n document.removeEventListener('click', this.closeOnEvent);\n document.removeEventListener('scroll', this.closeOnEvent);\n };\n}\n","import { globalEvent } from '@shared/easyfy.core';\nimport { invoke } from '@shared/easyfy.decorators';\nimport '@webModules/form';\nimport '@clientWebModules/header';\nimport Basket from '@clientWebModules/basket';\nimport { addCss, removeCss } from '@shared/easyfy.utils';\nimport { isDesktop, isMobile } from '@clientShared/utils';\nimport { GetLoginFlyout } from '@clientWebServices/header.service';\nimport { BreadCrumb } from '@clientWebModules/breadcrumb';\nimport Menu from '@clientWebModules/menu';\nimport CountrySelector from '@clientWebModules/countryselector';\n\n@invoke\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nclass Header {\n static Instance: Header;\n private header: HTMLElement = document.querySelector('header');\n private mainSection = document.querySelector('main');\n private sticky: number = isMobile() ? 0 : 35;\n private menuItems = document.querySelectorAll('[data-container=\"categories-section\"] .menu-item.level-1.has-children') as NodeListOf;\n private timer: any;\n\n constructor() {\n Header.Instance = this;\n Basket.getBasket();\n }\n\n onInit() {\n Menu;\n BreadCrumb;\n CountrySelector;\n\n globalEvent({\n type: 'click',\n events: [\n {\n action: 'toggle-login-flyout',\n callback: this.toggleLoginFlyout,\n },\n ],\n });\n\n document.addEventListener('scroll', this.onScroll.bind(this));\n document.addEventListener('readystatechange', () => {\n if (this.isLoginRequest()) {\n this.invokeOpenLoginFlyout();\n }\n });\n\n if (isDesktop()) {\n this.menuItems.forEach((item) => {\n item.addEventListener('mouseenter', () => {\n this.timer = setTimeout(() => addCss(this.mainSection, 'menu-overlay'), 400);\n });\n });\n\n this.menuItems.forEach((item) => {\n item.addEventListener('mouseleave', () => {\n removeCss(this.mainSection, 'menu-overlay');\n clearTimeout(this.timer);\n });\n });\n }\n }\n\n onScroll() {\n window.scrollY > this.sticky ? this.header.classList.add('is-sticky') : this.header.classList.remove('is-sticky');\n window.scrollY > this.sticky ? document.body.classList.add('header-sticky') : document.body.classList.remove('header-sticky');\n }\n\n toggleLoginFlyout = async (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n const openModals = document.querySelectorAll('[toggle-open]');\n const flyoutExists = document.querySelector('[data-container=\"login-flyout');\n\n openModals?.forEach((modal) => {\n (modal.querySelector('[data-event=\"toggle\"]') as HTMLElement)?.click();\n });\n\n const element: HTMLElement = e.target;\n\n if (flyoutExists) {\n this.removeFlyoutEvents(element);\n element.click();\n }\n await GetLoginFlyout()\n .then((response) => {\n if (response.data?.partialHtml && element) {\n document.body.insertAdjacentHTML('beforeend', response.data.partialHtml);\n addCss(document.body, 'noof');\n this.removeFlyoutEvents(element);\n }\n })\n .catch((error) => {\n console.log(error);\n });\n };\n\n removeFlyoutEvents = (element: HTMLElement) => {\n element.removeAttribute('data-action');\n element.dataset.event = 'toggle';\n element.dataset.overlay = '';\n element.dataset.target = isMobile() ? 'main-menu;login-flyout' : 'login-flyout';\n };\n\n private isLoginRequest = () => {\n return window.location.href.indexOf('#login') > -1;\n };\n\n private invokeOpenLoginFlyout = () => {\n const loginButton = document.querySelector('[data-action=\"toggle-login-flyout\"]') as HTMLElement;\n loginButton?.click();\n };\n}\n","import { invoke } from '@shared/easyfy.decorators';\nimport { element, elementsOf, globalEvent } from '@shared/easyfy.core';\nimport { addCss, replaceHtml, toggleClass } from '@shared/easyfy.utils';\nimport { animationEnded, isMobile } from '@clientShared/utils';\n\n@invoke\nexport default class Dropdown {\n static Instance: Dropdown;\n sliderTranslate: string = '';\n\n constructor() {\n Dropdown.Instance = this;\n }\n\n onInit() {\n globalEvent({\n type: 'click',\n events: [\n {\n event: 'select-sort-option',\n callback: this.onSortOptionClick,\n },\n {\n event: 'dd-toggle',\n callback: this.onVariantSelectorToggle.bind(this),\n },\n {\n event: 'dd-select',\n callback: this.onVariantSelectorOptionClick,\n },\n {\n event: 'dd-close',\n callback: this.closeVariantSelector.bind(this),\n },\n {\n callback: this.closeVariantSelector,\n },\n ],\n });\n\n document.addEventListener('close-variant-selector', () => {\n this.closeVariantSelector();\n });\n }\n\n onSortOptionClick(e) {\n e.preventDefault();\n\n let target = e?.target as HTMLElement;\n const parent = target?.parentElement?.parentElement;\n\n if (parent && target) {\n const optionValue = target.attributes['data-value']?.value;\n const optionText = target.querySelector(\"[data-container='sort-option-text']\")?.innerHTML;\n const selectedElement = parent.querySelector(\"[data-container='selected-sort-option']\") as HTMLElement;\n\n if (selectedElement) {\n selectedElement.innerHTML = optionText;\n selectedElement.dataset['value'] = optionValue;\n }\n\n parent.removeAttribute('open');\n parent.classList.remove('open');\n\n const customEvent = selectedElement?.attributes['data-custom-event']?.value;\n\n if (customEvent) {\n const event = new Event(customEvent, { bubbles: true, cancelable: true });\n selectedElement?.dispatchEvent(event);\n }\n }\n\n return false;\n }\n\n onVariantSelectorToggle(e: Event) {\n Dropdown.Instance.closeVariantSelector();\n\n const element: HTMLElement = e?.target as HTMLElement;\n const parent: HTMLElement = element.closest('[data-container=\"product-card\"]');\n const menu: HTMLElement = parent.querySelector('.dd-salesunit-menu');\n const selector: HTMLElement = parent.querySelector('.selector');\n const slider: HTMLElement = element.closest('[data-container=\"productlist-scroll\"]');\n\n const url: string = (parent.querySelector('a.product-info') as HTMLAnchorElement)?.href ?? null;\n const isCompact: boolean = parent.hasAttribute('product-card-compact');\n\n if (slider && isMobile()) this.disableSlider(slider);\n if (url && isMobile) this.createLink(url, menu);\n if (!parent || !menu || !selector) return;\n if (!isMobile()) addCss(selector, 'desktop');\n if (isCompact) element.dataset.event = 'dd-close';\n\n if (!menu.hasAttribute('dd-open')) {\n if (isMobile() && !isCompact) {\n // show salesunit selector buttom\n let salesunitContainer: HTMLElement = document.querySelector('.salesunitselector-mobile-container');\n let appendToBody = false;\n if (!salesunitContainer) {\n salesunitContainer = document.createElement('div');\n salesunitContainer.classList.add('salesunitselector-mobile-container', 'productcard-regular', 'dd-open');\n salesunitContainer.setAttribute('data-container', 'product-card');\n appendToBody = true;\n } else {\n salesunitContainer.innerText = '';\n salesunitContainer.classList.add('dd-open');\n }\n\n const menuClone: HTMLElement = menu.cloneNode(true) as HTMLElement;\n menuClone.setAttribute('dd-open', '');\n menuClone.removeAttribute('dd-closing');\n\n const button: HTMLElement =\n parent.querySelector('[data-container=\"addtocart-btn\"]') ??\n parent.querySelector('[data-container=\"view-product\"]') ??\n parent.querySelector('[data-action=\"subscribe\"]');\n if (button) {\n menuClone.insertAdjacentHTML('beforeend', button.outerHTML);\n }\n\n salesunitContainer.appendChild(menuClone);\n\n if (appendToBody) {\n document.body.appendChild(salesunitContainer);\n }\n\n document.body.classList.add('noof');\n } else {\n toggleClass(parent, 'dd-open');\n menu.setAttribute('dd-open', '');\n }\n }\n }\n\n createLink = (url: string, menu: HTMLElement) => {\n const link = document.createElement('a');\n link.href = url;\n const productInfo = menu.querySelector('.product-info');\n link.innerHTML = productInfo.innerHTML;\n addCss(link, 'product-info');\n productInfo.parentNode.replaceChild(link, productInfo);\n };\n\n onVariantSelectorOptionClick(e) {\n const element: HTMLElement = e?.target;\n const productId: string = element.dataset.value;\n const salesUnitCode: string = element.dataset.salesunitcode;\n const upsellId: string = element.dataset.upsellid;\n const parent: HTMLElement = element.closest('[data-container=\"product-card\"]') ?? element.closest('[data-container=\"product\"]');\n const buyButtons: NodeListOf = parent?.querySelectorAll('[data-container=\"addtocart-btn\"]');\n const selectedVariant: HTMLElement = parent ? elementsOf(parent, '[data-container=\"selected-variant\"]') : null;\n const prodPageActionElement: HTMLElement = parent ? elementsOf(parent, '.pp-actions') : null;\n const priceContainer: HTMLElement = parent ? parent.querySelector('[data-container=\"price-container\"]') : null;\n const isCompact: boolean = parent.hasAttribute('product-card-compact');\n const flags: NodeListOf = parent?.querySelectorAll('.flag[data-salesunit]');\n\n Dropdown.Instance.removeSelectedVariant(element);\n element.setAttribute('selected', 'selected');\n Dropdown.Instance.updateBuyButtonValue(buyButtons, productId, salesUnitCode, upsellId);\n Dropdown.Instance.updateFlagVisibility(flags, salesUnitCode);\n\n if (!prodPageActionElement) Dropdown.Instance.updateHtml(selectedVariant, element, isCompact, priceContainer);\n if (prodPageActionElement) Dropdown.Instance.updateProductPageActionInfo(parent, prodPageActionElement);\n\n if (!isMobile() || isCompact) Dropdown.Instance.closeVariantSelector();\n }\n\n closeVariantSelector(e?: Event) {\n const openProductCard: HTMLElement = element('[data-container=\"product-card\"].dd-open');\n\n if (!openProductCard) return false;\n\n const target = e?.target as HTMLElement | undefined;\n\n if (target && target.hasAttribute('dd-open')) return;\n\n const isProductCardCompact: boolean = openProductCard?.hasAttribute('product-card-compact');\n const selectedVariant: HTMLElement = openProductCard?.querySelector('[data-container=\"selected-variant\"]');\n const slider: HTMLElement = element('[data-container=\"productlist-scroll\"].disable-slider');\n const menu: HTMLElement = openProductCard.querySelector('.dd-salesunit-menu');\n const button: HTMLElement = menu.querySelector('[data-container=\"addtocart-btn\"]');\n\n if (!menu) return;\n\n if (isProductCardCompact && selectedVariant) {\n menu.removeAttribute('dd-open');\n openProductCard.classList.remove('dd-open');\n selectedVariant.dataset.event = 'dd-toggle';\n return;\n }\n\n menu.setAttribute('dd-closing', '');\n animationEnded(menu, () => {\n menu.removeAttribute('dd-closing');\n menu.removeAttribute('dd-open');\n if (isMobile()) {\n document.body.classList.remove('noof');\n button?.remove();\n }\n toggleClass(openProductCard, 'dd-open');\n if (slider && isMobile()) this.enableSlider(slider);\n });\n }\n\n removeSelectedVariant = (element: HTMLElement) => {\n const selectedVariant: HTMLElement = elementsOf(element?.parentElement, '[data-container=\"dd-option\"][selected]');\n if (selectedVariant) selectedVariant.removeAttribute('selected');\n };\n\n updateBuyButtonValue = (buyButtons: NodeListOf, productId: string, salesUnitCode: string, upsellId: string) => {\n if (!buyButtons || !productId) return;\n\n buyButtons.forEach((button) => {\n button.dataset.productid = productId;\n button.dataset.salesunitcode = salesUnitCode;\n button.dataset.upsellid = upsellId;\n });\n };\n\n updateFlagVisibility = (flags: NodeListOf, salesUnitCode: string) => {\n if (!flags || !salesUnitCode) return;\n\n const currentVisibleFlags = Array.from(flags).filter((flag) => flag.hasAttribute('data-current'));\n currentVisibleFlags.forEach((flag) => {\n flag.removeAttribute('data-current');\n });\n\n const newVisibleFlags = Array.from(flags).filter((flag) => flag.getAttribute('data-salesunit') === salesUnitCode);\n newVisibleFlags.forEach((flag) => {\n flag.setAttribute('data-current', 'true');\n });\n };\n\n updateHtml = (selectedVariant: HTMLElement, element: HTMLElement, isSearch: boolean, priceContainer: HTMLElement) => {\n if (!selectedVariant || !element) return;\n\n selectedVariant.innerHTML = element.innerHTML;\n priceContainer.attributes['data-unitprice'].value = element.querySelector('[data-container=\"unit-price\"]')?.innerHTML;\n selectedVariant.dataset.value = element.dataset.value;\n const newPacksize = selectedVariant.querySelector('[data-container=\"packsize\"]').attributes['data-packsize']?.value;\n\n if (newPacksize) priceContainer.attributes['data-packsize'].value = newPacksize;\n\n if (!isSearch) {\n const packsize: HTMLElement = elementsOf(selectedVariant, '.packsize');\n const packsizehtml = `${packsize?.innerHTML}`;\n replaceHtml(packsize, packsizehtml);\n } else {\n const price: HTMLElement = elementsOf(selectedVariant, '.price');\n const pricehtml = `${price?.innerHTML}`;\n replaceHtml(price, pricehtml);\n }\n };\n\n updateProductPageActionInfo = (parent: HTMLElement, prodPageActionElement: HTMLElement) => {\n const variants: HTMLElement = elementsOf(parent, '.selector.productpage');\n const selectedVariant: HTMLElement = elementsOf(variants, '[selected=\"selected\"]');\n if (!selectedVariant) return;\n const selectedPackSize: HTMLElement = elementsOf(selectedVariant, '.packsize');\n const selectedPrice: HTMLElement = elementsOf(selectedVariant, '.price');\n const price: HTMLElement = elementsOf(prodPageActionElement, '.price');\n const packsize: HTMLElement = elementsOf(prodPageActionElement, '.packsize');\n if (price) {\n price.innerText = selectedPrice.innerText;\n }\n if (packsize) {\n packsize.innerText = selectedPackSize.innerText;\n }\n };\n\n disableSlider = (slider: HTMLElement) => {\n toggleClass(slider, 'disable-slider');\n this.sliderTranslate = (slider.querySelector('.splide__list') as HTMLElement)?.getAttribute('style')?.toString();\n };\n\n enableSlider = (slider: HTMLElement) => {\n toggleClass(slider, 'disable-slider');\n (slider.querySelector('.splide__list') as HTMLElement)?.setAttribute('style', this.sliderTranslate);\n };\n}\n","import { invoke } from '@shared/easyfy.decorators';\nimport { globalEvent, elements } from '@shared/easyfy.core';\nimport { visible } from '@shared/easyfy.utils';\nimport { animationEnded, isMobile } from '@clientShared/utils';\n\n@invoke\nexport default class Toggle {\n static Instance: Toggle;\n Event: string = 'toggle';\n\n constructor() {\n Toggle.Instance = this;\n\n globalEvent({\n type: 'click',\n events: [\n {\n callback: (e) => {\n Toggle.Instance.hideToggle(e?.target);\n },\n },\n {\n event: this.Event,\n callback: this.onToggleElement,\n },\n {\n event: 'toggle-list',\n callback: this.onToggleList,\n },\n ],\n });\n }\n\n onToggleElement(e: Event, el: HTMLElement, hide: boolean) {\n if (e) {\n if (e?.preventDefault) e.preventDefault();\n if (e.target) el = e.target as HTMLElement;\n }\n\n let target = el.dataset.target || undefined;\n\n if (!target) {\n el = el.parentNode as HTMLElement;\n target = el.dataset.target || undefined;\n }\n\n if (!target) return false;\n const targetList = target.split(';');\n\n const targetElements: HTMLElement[] = [];\n\n targetList.forEach((target) => {\n const divs = Array.from(document.querySelectorAll(`[data-container=\"${target}\"]`));\n targetElements.push(...divs);\n });\n\n if (!targetElements) return false;\n const hiddenValue: string = el.attributes['data-hidden-value']?.value;\n\n targetElements.forEach((item) => {\n if (!item.hasAttribute('toggle-open') && !hide) {\n item.setAttribute('toggle-open', '');\n document.body.classList.add('noof');\n } else {\n item.setAttribute('toggle-closing', '');\n\n animationEnded(item, () => {\n item.removeAttribute('toggle-closing');\n item.removeAttribute('toggle-open');\n document.body.classList.remove('noof');\n });\n\n // item.addEventListener('animationend', (e) =>{\n // item.removeAttribute('toggle-closing');\n // item.removeAttribute('toggle-open');\n // document.body.classList.remove('noof');\n // }, {once: true});\n }\n\n if (hiddenValue) {\n const hiddenInput: HTMLInputElement = item.querySelector('[data-hidden-value]');\n if (hiddenInput) {\n hiddenInput.value = hiddenValue;\n }\n\n const form: HTMLElement = item.querySelector('[data-action=\"ajax-form\"][data-update]');\n if (form) {\n form.setAttribute('data-update', `${form.attributes['data-update']?.value}-${hiddenValue}`);\n }\n }\n });\n\n return false;\n }\n\n hideToggle(target: any) {\n const toggleElements: NodeListOf = elements(`[data-event=\"${Toggle.Instance.Event}\"]`);\n const targetsToHide: Map = new Map();\n\n toggleElements.forEach((el) => {\n const dataTarget = el.attributes['data-target']?.value;\n\n const dataTargetElement: NodeListOf = document.querySelectorAll(`[data-container=\"${dataTarget}\"]`);\n dataTargetElement.forEach((item) => {\n if (document.contains(target) && !el.contains(target) && visible(item) && visible(el) && !item.contains(target) && el !== target) {\n if (item.hasAttribute('toggle-open')) targetsToHide.set(item.dataset.container, el);\n }\n });\n });\n\n targetsToHide.forEach((item) => this.onToggleElement(null, item, true));\n }\n\n onToggleList(e: Event) {\n const el = e.target as HTMLElement;\n const onlyMobile = el.dataset.onlymobile;\n if (onlyMobile && !isMobile()) return;\n const listEl = el?.closest('ul');\n if (listEl) {\n listEl.hasAttribute('list-open') ? listEl.removeAttribute('list-open') : listEl.setAttribute('list-open', '');\n }\n }\n}\n","import { invoke } from '@shared/easyfy.decorators';\nimport { globalEvent } from '@shared/easyfy.core';\nimport { addCss, removeCss } from '@shared/easyfy.utils';\nimport { PostForm } from '@clientWebServices/form.service';\nimport { replaceContent } from './utils';\n\n@invoke\nexport default class Form {\n static Instance: Form;\n\n constructor() {\n Form.Instance = this;\n globalEvent({\n type: 'submit',\n events: [\n {\n action: 'haypp-ajax-form',\n callback: this.onPostHayppForm,\n },\n ],\n });\n globalEvent({\n type: 'click',\n events: [\n {\n event: 'toggle-password',\n callback: this.onTogglePassword,\n },\n ],\n });\n globalEvent({\n type: 'input',\n events: [\n {\n event: 'input-password',\n callback: this.onPasswordInput,\n },\n {\n event: 'confirm-password',\n callback: this.onConfirmPasswordInput,\n },\n ],\n });\n }\n\n onPostHayppForm(e: Event) {\n e.preventDefault();\n e.stopPropagation();\n\n const element: HTMLFormElement = e.target as HTMLFormElement;\n const data: FormData = new FormData(element);\n const tokenEl: HTMLElement = element.closest('[data-token]') as HTMLElement;\n const token: string =\n tokenEl && tokenEl.dataset?.token\n ? tokenEl.dataset?.token\n : (document.querySelector('[name=\"__RequestVerificationToken\"]') as HTMLInputElement)?.value ?? '';\n\n PostForm(element.attributes['action']?.value, data, token).then((response) => {\n if (response.data.success) {\n if (Form.Instance.getReturnUrl()) return (window.location.href = Form.Instance.getReturnUrl());\n\n if (response.data.partials) {\n for (const [key, value] of Object.entries(response.data.partials)) {\n const container = document.querySelector(`[data-container=\"${key}\"]`);\n if (container) replaceContent(container, value as string, 'replaceInnerHtml');\n }\n } else if (response.data.reload) {\n setTimeout(function () {\n location.reload();\n }, 700);\n } else if (response.data.clearForm) {\n element.reset();\n if (response.data.partial) {\n Form.Instance.processPartial(response.data.partial);\n }\n } else {\n if (response.data.partial) {\n Form.Instance.processPartial(response.data.partial);\n }\n }\n } else {\n const errorMessages = response?.data?.errorMessages;\n if (element && response.data.generalErrorMessage) Form.Instance.setValidationSummary(element, response.data.generalErrorMessage?.value);\n if (element) Form.Instance.resetErrorMessages(element);\n if (errorMessages) Form.Instance.setErrorMessages(element, errorMessages);\n }\n });\n\n return false;\n }\n\n private getReturnUrl = (): string => {\n const url = new URL(window.location.href);\n const params = new URLSearchParams(url.search);\n return params?.get('ReturnUrl');\n };\n\n onTogglePassword = (e: Event) => {\n const el = e.target as HTMLInputElement;\n const pwdEl = el.closest('.form-group') as HTMLElement;\n const pwdInput = pwdEl?.querySelector('input') as HTMLInputElement;\n const showIcon = pwdEl?.querySelector('i') as HTMLElement;\n if (!pwdInput) return;\n if (pwdInput.type == 'password') {\n pwdInput.type = 'text';\n showIcon?.classList.remove('icon-show-true');\n showIcon?.classList.add('icon-show-false');\n } else {\n pwdInput.type = 'password';\n showIcon?.classList.remove('icon-show-false');\n showIcon?.classList.add('icon-show-true');\n }\n };\n\n onPasswordInput = (e: Event) => {\n const inputEl = e?.target as HTMLInputElement;\n const value = inputEl.value;\n\n this.updateRequirement('length', value.length >= 8);\n this.updateRequirement('lowercase', /[a-z]/.test(value));\n this.updateRequirement('uppercase', /[A-Z]/.test(value));\n this.updateRequirement('number', /\\d/.test(value));\n this.updateRequirement('characters', /[!@#$%^&*_+=,.?-]/.test(value));\n\n this.handleFormValidation(inputEl.closest('form') as HTMLFormElement);\n };\n\n onConfirmPasswordInput = (e: Event) => {\n const confirmPassword = e?.target as HTMLInputElement;\n const form = confirmPassword.closest('form') as HTMLFormElement;\n const password = form.querySelector('input[name=\"newpassword\"]') as HTMLInputElement;\n\n if (confirmPassword && password) {\n this.updateRequirement('match', confirmPassword.value == password.value);\n this.handleFormValidation(form);\n return true;\n }\n this.handleFormValidation(form);\n return false;\n };\n\n processPartial = (dataPartial: any) => {\n for (const [key, value] of Object.entries(dataPartial)) {\n const container = document.querySelector(`[data-container=\"${key}\"]`);\n if (container) replaceContent(container, value as string, 'append', false);\n }\n };\n\n resetErrorMessages = (element: HTMLElement) => {\n element.querySelectorAll('.error')?.forEach((el) => {\n removeCss(el, 'error');\n if (el.querySelector('[data-container=\"error-message\"')) el.querySelector('[data-container=\"error-message\"').innerHTML = '';\n });\n };\n\n setErrorMessages = (element: HTMLElement, errorMessages) => {\n errorMessages?.forEach((error) => {\n const propertyName = error?.propertyName?.toLowerCase();\n const inputContainer = element.querySelector(`[data-container=\"form-${propertyName}\"]`) as HTMLElement;\n const messageContainer = inputContainer.querySelector('[data-container=\"error-message\"');\n const errorMessage = error?.errorMessage;\n if (messageContainer && errorMessage) {\n messageContainer.innerHTML = errorMessage;\n addCss(inputContainer, 'error');\n }\n });\n };\n\n setValidationSummary = (element: HTMLElement, message: string) => {\n const validationSummaryContainer = element.querySelector('[data-container=\"validation-summary\"');\n if (validationSummaryContainer) validationSummaryContainer.innerHTML = message;\n };\n\n handleFormValidation = (form: HTMLFormElement) => {\n if (!form) return false;\n\n const validationErrors = form.querySelector('.password-validation-errors');\n const password = form.querySelector('input[name=\"newpassword\"]') as HTMLInputElement;\n const confirmPassword = form.querySelector('input[name=\"confirmpassword\"]') as HTMLInputElement;\n const submit = form.querySelector('button[type=\"submit\"]') as HTMLButtonElement;\n const isFormValid = validationErrors?.querySelectorAll('.requirement:not(.hidden)').length === 0;\n\n if (password.value && confirmPassword.value && isFormValid) {\n submit.removeAttribute('disabled');\n return true;\n }\n\n submit.setAttribute('disabled', 'disabled');\n return false;\n };\n\n updateRequirement = (id: string, valid: boolean) => {\n const requirement = document.getElementById(id);\n if (requirement) {\n if (valid) {\n requirement.classList.add('hidden');\n } else {\n requirement.classList.remove('hidden');\n }\n }\n };\n}\n","import easyfyAxios from '@shared/easyfy.axios';\n\nexport const PostForm = (url: string, data: any, token: any) => {\n return easyfyAxios.post(url, data, token);\n};\n","import easyfyAxios from '@shared/easyfy.axios';\nimport { sleep } from '@shared/easyfy.utils';\n\nexport const LogOut = async () => {\n await easyfyAxios.get('/api/logout');\n await sleep(200); //For logged out events to have time to be sent\n};\n","import { invoke } from '@shared/easyfy.decorators';\nimport { globalEvent } from '@shared/easyfy.core';\nimport { LogOut } from '@clientWebServices/logout.service';\n\n@invoke\nexport default class Form {\n static Instance: Form;\n\n constructor() {\n Form.Instance = this;\n globalEvent({\n type: 'click',\n events: [\n {\n action: 'log-out',\n callback: this.onLogOut,\n },\n ],\n });\n }\n\n onLogOut(e: Event) {\n e.preventDefault();\n e.stopPropagation();\n\n LogOut()\n .then(() => (window.location.href = '/'))\n .catch((err) => console.log(err));\n }\n}\n","import { globalEvent } from '@shared/easyfy.core';\nimport { GetAgeGate } from '../services/agegate.service';\n\nexport default class AgeGate {\n static Instance: AgeGate;\n constructor() {\n AgeGate.Instance = this;\n globalEvent({\n type: 'click',\n events: [\n {\n event: 'age-gate-accept',\n callback: this.acceptAgeGate,\n },\n ],\n });\n\n this.checkCookie();\n }\n\n checkCookie = () => {\n if (!this.checkIfActiveFeature()) return;\n\n const cookie = document.cookie\n ?.split('; ')\n ?.find((row) => row.startsWith('AgeGate'))\n ?.split('=')[1];\n\n if (!cookie) AgeGate.Instance.loadAgeGate();\n };\n\n loadAgeGate = async () => {\n const response = await GetAgeGate();\n if (response.data?.partialHtml) document.body.insertAdjacentHTML('beforeend', response.data.partialHtml);\n };\n\n acceptAgeGate = () => {\n document.cookie = 'AgeGate=true';\n const ageGate: HTMLElement = document.querySelector('[data-container=\"age-gate\"');\n if (ageGate) ageGate.remove();\n };\n\n checkIfActiveFeature = (): boolean => {\n return document.documentElement.hasAttribute('agegate');\n };\n}\n","import easyfyAxios from '@shared/easyfy.axios';\n\nexport const GetAgeGate = async (): Promise => {\n return await easyfyAxios.get('/api/agegate');\n};\n","import { invoke } from '@shared/easyfy.decorators';\nimport { element, globalEvent } from '@shared/easyfy.core';\nimport { GetProductOption } from '../services/productoptions.service';\nimport { SnackBar, SnackbarSeverity } from './snackbar';\n\n@invoke\nexport class OptionSelector {\n constructor() {\n globalEvent({\n type: 'click',\n events: [\n {\n action: 'select-variant',\n callback: this.selectVariant.bind(this),\n },\n {\n action: 'select-subscription-freq',\n callback: this.selectFrequency.bind(this),\n },\n {\n event: 'select-subscripton-packsize',\n callback: this.selectSalesUnit.bind(this),\n },\n {\n action: 'update-frequency',\n callback: this.updateFrequency.bind(this),\n },\n ],\n });\n }\n\n onInit() {\n if (window.location.hash) {\n this.getSelectedOption(window.location.hash.replace('#', ''));\n }\n return false;\n }\n\n selectVariant = (e: Event) => {\n const selectedOptionEl = e.target as HTMLElement;\n const selectedOptionId = selectedOptionEl.dataset['optionId'];\n\n if (!selectedOptionId) return false;\n\n this.getSelectedOption(selectedOptionId);\n return false;\n };\n\n private getSelectedOption = (selectedOptionId: string) => {\n GetProductOption(selectedOptionId)\n .then((response) => this.updateProductPageWithSelectedOption(response))\n .catch((error) => {\n console.log(error);\n });\n };\n\n private updateProductPageWithSelectedOption = (response: any) => {\n if (response?.data == null || !response?.data?.success) {\n if (response?.data?.errorMessage) {\n SnackBar.appendSnackbar(SnackbarSeverity.error, response.data.errorMessage);\n }\n return false;\n }\n\n const prodContainerEl = element('[data-container=\"product\"]') as HTMLElement;\n const prodRecommendationsEl = element('[data-container=\"related-products\"]') as HTMLElement;\n const prodContainerHtml = response?.data?.partialHtmlProdContainer;\n const prodRecommendationsHtml = response?.data?.partialHtmlProdRecommendations;\n\n if (prodContainerEl != null && prodContainerHtml != null) {\n prodContainerEl.innerHTML = prodContainerHtml;\n\n if (prodRecommendationsEl != null && prodRecommendationsHtml != null) {\n prodRecommendationsEl.innerHTML = prodRecommendationsHtml;\n const updateProdListEvt = new Event('component-productlistupdate', { bubbles: true, cancelable: false });\n document.dispatchEvent(updateProdListEvt);\n }\n\n document.body.classList.remove('noof');\n }\n\n if (response.data?.searchProductId) {\n window.location.hash = response.data.searchProductId;\n }\n };\n\n private selectFrequency = (e: Event) => {\n this.updateSubscriptionData(e, ['optionid', 'optioninterval']);\n return false;\n };\n\n private selectSalesUnit = (e: Event) => {\n this.updateSubscriptionData(e, ['salesunitcode']);\n return false;\n };\n\n private updateSubscriptionData(e: Event, dataKeys: string[]) {\n const optionEl = e.target as HTMLElement;\n const parentEl = optionEl?.closest('[data-container=\"subscription-selector\"]') as HTMLElement;\n\n if (!this.updateSelectedAttr(optionEl, parentEl)) return false;\n\n this.updateButtonsData(optionEl, parentEl, dataKeys);\n\n return false;\n }\n\n private updateSelectedAttr(el: HTMLElement, parentEl: HTMLElement): boolean {\n if (el?.hasAttribute('selected')) return false;\n\n const selected = parentEl?.querySelector('[selected]');\n selected?.removeAttribute('selected');\n el.setAttribute('selected', 'selected');\n return true;\n }\n\n private updateButtonsData(el: HTMLElement, parentEl: HTMLElement, dataKeys: string[]) {\n const flyoutEl = parentEl.closest('.options-selector');\n const button = flyoutEl?.querySelector('[data-container=\"update-button\"') as HTMLButtonElement;\n const addToCartBtn = flyoutEl?.querySelector('[data-action=\"add-to-cart\"]');\n\n const newInterval: string = el?.dataset?.optioninterval;\n if (button) this.checkEnableButton(button, newInterval);\n\n dataKeys.forEach((dataKey) => {\n const selectedOptionDataValue = el?.dataset[dataKey];\n if (selectedOptionDataValue) {\n if (addToCartBtn) addToCartBtn?.setAttribute('data-' + dataKey, selectedOptionDataValue);\n else if (button) button?.setAttribute('data-' + dataKey, selectedOptionDataValue);\n }\n });\n }\n\n private checkEnableButton = (button: HTMLButtonElement, newInterval: string) => {\n const el = document.querySelector('[data-originally-selected]') as HTMLElement;\n\n if (el && button) {\n const originalInterval = el.dataset.optioninterval;\n button.disabled = originalInterval === newInterval;\n }\n };\n\n private updateFrequency = (e: Event) => {\n const el = e.target as HTMLElement;\n const selectedOptionInterval = el?.dataset?.optioninterval;\n const selectedOptionId = el?.dataset?.optionid;\n\n const frequencyFlyout = el?.closest('[data-container=\"frequency-selector\"]');\n const productFlyout = frequencyFlyout?.closest('[data-subscription-flyout]');\n\n const selectedOption = frequencyFlyout?.querySelector('.option[selected=\"selected\"]')?.querySelector(':scope > span') as HTMLElement;\n const selectedOptionIntervalName = selectedOption?.innerText;\n\n const addToCartBtn = productFlyout?.querySelector('[data-action=\"add-to-cart\"]');\n const selectedFrequency = productFlyout?.querySelector('.option.selected-freq-option');\n\n if (selectedOptionInterval) {\n addToCartBtn?.setAttribute('data-optioninterval', selectedOptionInterval);\n }\n if (selectedOptionId) {\n addToCartBtn?.setAttribute('data-optionid', selectedOptionId);\n selectedFrequency?.setAttribute('data-optionid', selectedOptionId);\n }\n if (selectedOptionIntervalName) {\n const freq = selectedFrequency?.querySelector(':scope >span') as HTMLElement;\n freq.innerText = selectedOptionIntervalName;\n }\n const flyoutCloseBtn = element('[data-target=\"frequency-selector\"]') as HTMLElement;\n flyoutCloseBtn?.click();\n };\n}\n","import easyfyAxios from '@shared/easyfy.axios';\n\nexport const GetProductOption = async (optionId: string): Promise => {\n return await easyfyAxios.get(`/api/productoptionsselector?searchProductId=${optionId}`);\n};\n\nexport const GetSubscriptionFlyoutView = async (productId: string): Promise => {\n return await easyfyAxios.get(`/product?handler=subscriptionflyoutview&searchProdId=${productId}`);\n};\n\nexport const GetSubscriptionFlyoutViewForProductList = async (productId: string, variantId: string): Promise => {\n return await easyfyAxios.get(`/product?handler=subscriptionflyoutviewforproductlist&searchProdId=${productId}&variantId=${variantId}`);\n};\n","import { element, elementsOf, globalEvent } from '@shared/easyfy.core';\nimport { GetSubscriptionFlyoutViewForProductList } from '@clientWebServices/productoptions.service';\n\nexport default class SubscriptionHelper {\n static Instance: SubscriptionHelper;\n\n constructor() {\n SubscriptionHelper.Instance = this;\n globalEvent({\n type: 'click',\n events: [\n {\n action: 'subscribe',\n callback: this.loadSubscriptionFlyout,\n },\n ],\n });\n }\n\n loadSubscriptionFlyout = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n const closeVariantSelector = new CustomEvent('close-variant-selector');\n document.dispatchEvent(closeVariantSelector);\n\n const button: HTMLElement = e.target as HTMLElement;\n const productId = button.getAttribute('data-productId');\n\n const parent: HTMLElement = button.closest('[data-container=\"product-card\"]') ?? button.closest('[data-container=\"product\"]');\n const selectedVariant: HTMLElement = parent ? elementsOf(parent, '[data-container=\"selected-variant\"]') : null;\n const variantId = selectedVariant?.getAttribute('data-value');\n const flyout = element(`[data-container=\"product-options-selector-subscription-${productId}\"]`) ?? false;\n\n if (button && productId) {\n if (!flyout) {\n GetSubscriptionFlyoutViewForProductList(productId, variantId)\n .then((res) => {\n if (res?.data?.success && res?.data?.partialHtml != null) {\n const content = document.createRange().createContextualFragment(res?.data?.partialHtml).firstElementChild;\n document.querySelector('body').appendChild(content);\n document.body.classList.add('noof');\n content.setAttribute('toggle-open', '');\n }\n })\n .catch((err) => {\n console.log(err);\n });\n } else {\n flyout.setAttribute('toggle-open', '');\n }\n }\n\n return false;\n };\n}\n","import { setCookie } from '@clientShared/utils';\nimport { GetCountryPopupModal, ICountryPopupRequest } from '@clientWebServices/countrypopup.service';\nimport { globalEvent } from '@shared/easyfy.core';\nimport { invoke } from '@shared/easyfy.decorators';\nimport { addCss } from '@shared/easyfy.utils';\n\n@invoke\nexport default class CountryPopup {\n private countryPopup: HTMLElement | null = document.querySelector('[data-container=\"country-popup\"]');\n private static COOKIE_NAME = 'countryPopupDismissed';\n\n onInit() {\n if (!this.isCountryPopupDismissed() && this.countryPopup) {\n this.getCountryPopup();\n }\n\n globalEvent({\n type: 'click',\n events: [\n {\n event: 'close-country-popup',\n callback: this.closeCountryPopup,\n },\n ],\n });\n }\n\n getCountryPopup = async () => {\n const data: ICountryPopupRequest = {\n country: this.countryPopup.dataset.country,\n site: this.countryPopup.dataset.site,\n };\n\n await GetCountryPopupModal(data)\n .then((response) => {\n if (response.data.success && response.data.confirmationDialogHtml !== '') {\n addCss(this.countryPopup, 'modal-window');\n this.countryPopup.innerHTML = response.data.confirmationDialogHtml;\n }\n })\n .catch((error) => {\n console.error('Failed to get country popup modal.', {\n action: 'GetCountryPopupModal',\n error: error.message,\n data,\n });\n });\n };\n\n closeCountryPopup = () => {\n this.countryPopup.remove();\n this.setCookie();\n };\n\n static getCookieName(): string {\n return CountryPopup.COOKIE_NAME;\n }\n\n setCookie = () => {\n const date = new Date();\n date.setFullYear(date.getFullYear() + 1); // Add 1 year\n\n setCookie('true', CountryPopup.getCookieName(), date);\n };\n\n isCountryPopupDismissed = (): boolean => {\n const cookie = document.cookie\n ?.split('; ')\n ?.find((row) => row.startsWith(CountryPopup.getCookieName() + '='))\n ?.split('=')[1];\n\n return cookie !== undefined;\n };\n}\n","import easyfyAxios from '@shared/easyfy.axios';\n\nexport interface ICountryPopupRequest {\n country: string;\n site: string;\n}\n\nexport const GetCountryPopupModal = async (data: ICountryPopupRequest): Promise => {\n return await easyfyAxios.get(`/api/countrypopup?country=${data.country}&site=${data.site}`);\n};\n","import { invoke } from '@shared/easyfy.decorators';\nimport Events, { ServiceNames } from '@shared/easyfy.events/easyfy.eventhandler';\nimport { Ga4DataMapper } from '@clientWebModules/eventMappers/dataMapper.ga4';\nimport { StatsDataMapper } from '@shared/easyfy.events/mappers/dataMapper.stats';\nimport { KlaviyoDataMapper } from '@shared/easyfy.events/mappers/dataMapper.klaviyo';\nimport { IDataMapper } from '@shared/easyfy.events/easyfy.eventdata';\nimport Search, { SearchConfig } from '@webModules/search';\nimport '@clientWebModules/header';\nimport '@clientWebModules/dropdown';\nimport '@clientShared/toggle';\nimport '@clientShared/form';\nimport '@clientShared/logout';\nimport AgeGate from '@clientWebModules/agegate';\nimport { OptionSelector } from '@clientWebModules/optionselector';\nimport SubscriptionHelper from '@clientShared/subscriptionHelper';\nimport CountryPopup from '@clientWebModules/countrypopup';\n\n@invoke\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nclass Global {\n constructor() {\n new Search.Search(new SearchConfig(3, 'grid')).OnInit();\n new Events.EasyfyEventHandler(\n new Map([\n [ServiceNames.Ga4, new Ga4DataMapper()],\n [ServiceNames.Stats, new StatsDataMapper()],\n [ServiceNames.Klaviyo, new KlaviyoDataMapper()],\n ])\n );\n new AgeGate();\n new CountryPopup();\n new SubscriptionHelper();\n\n OptionSelector;\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.j = 6203;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t6203: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackJsonpWeb\"] = self[\"webpackJsonpWeb\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [6017], () => (__webpack_require__(3142)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","query","document","querySelector","querySelectorAll","elementsOf","element","getBlazorEditMode","window","isAdminModeEnabled","undefined","isEditModeEnabled","editModeCookie","cookie","split","find","trim","startsWith","toLowerCase","docReady","callback","context","blazorFinishedLoadingEventRegistered","EasyfyMethods","triggerWindowEvent","eventName","eventData","event","CustomEvent","detail","dispatchEvent","readyList","readyFired","readyEventHandlersInstalled","ready","readyBody","i","length","fn","call","ctx","blazorFinishedLoading","addEventListener","TypeError","setTimeout","push","readyState","globalEventList","globalEvent","type","forEach","events","item","foundItem","action","actionFound","globalFindAction","eventFound","globalFindEvent","globalFound","globalFind","globalEventAdd","body","removeEventListener","globalEventHandler","e","target","eventTarget","globalGetTargetAction","globalEventInvokeCallback","globalGetTargetEvent","globalMatchType","cbs","itemType","eventType","actionType","globalGetTarget","dataTarget","attributes","value","parentNode","parseToBoolean","val","isString","replaceHtml","html","outerHTML","tmpElement","createElement","innerHTML","replaceChild","showAll","el","displayType","style","display","hideAll","show","selector","Element","hide","removeCss","className","Array","isArray","NodeList","classList","remove","add","visible","offsetWidth","offsetHeight","getClientRects","toggleClass","force","HTMLElement","toggle","func","waitFor","timeout","args","Promise","resolve","clearTimeout","invoke","ctor","newClass","readyAfter","prototype","onInit","apply","error","init","resolves","err","hasOwnProperty","injector","dependencies","resolveOnload","depends","cb","id","len","Math","random","toString","substr","name","data","index","dependencyItem","loadedVal","Object","defineProperty","get","set","splice","dependencyFunc","key","this","enumerable","configurable","obj","prop","writable","handler","oldval","newval","getter","setter","EasyfyEventData","AddDataToEventLayer","EasyfyEventLayer","products","product","productLists","productList","productPrices","price","basket","notification","notifications","AddCustomDataToEventLayer","customData","GlobalIgnoreEvents","result","configuration","addProductImpressionsServerSide","SiteInfo","site","PageInfo","pageInfo","Events","ClearEvents","ShouldRegisterProductImpressions","ShouldRegisterBannerImpressions","addBannerImpressionsServerSide","GetAllServices","services","GetService","serviceName","serviceInstance","GetServiceNames","service","ServiceIsActive","enabled","ConsumesEvent","includeAllEvents","replace","Product","ProductAt","atIndex","Products","ids","productDataSet","ProductsAt","indexes","AllProducts","AllProductLists","ProductIndexInList","listName","productId","productsInList","ProductIds","indexOf","ProductSalesUnitPrice","ProductSalesUnitPrices","prices","AllProductSalesUnitPrices","Banner","banners","AllBanners","HasNotifications","Notifications","ClearNotifications","HasEvents","Basket","GetCurrencyCode","returnValue","currencyCode","GetCustomData","GetClientEventMetaData","SessionId","localStorage","getItem","LocalStorageKeys","UserId","ClientId","IsDesktop","IsDekstop","IsMobilePhone","IsTablet","IPAddress","IsRecurringUser","flagAsRecurringAfterCheck","cookieKey","UserIdCookieKey","userId","GetCookieValue","LastCheckedUserId","setItem","cookieName","SetStatsApiBlock","block","StatsIsBlocked","removeItem","StatsApiIsBlocked","StatsEventExporter","_payloadKbThreshold","_eventThreshold","_eventThresholdRemoved","WithMapper","mapper","LoadAndSetTransitionStatus","CheckVisibility","bind","RegisterEvent","MapEventData","AccumulateEvent","StatsEventsThresholdRemoved","storedDataString","StatsEventsTransitionObj","_eventData","JSON","parse","ClientMetaData","EventRequests","RecheckAndSetTransitionStatus","eventsMatch","skipEventNames","EventNames","BannerImpression","ElementImpression","ProductImpression","includes","Event","stringify","str","bytes","TextEncoder","encode","blob","Blob","_blob","GetObjectSizeInKB","SendEventsToStatsApi","navigator","sendBeacon","visibilityState","jsonString","EasyfyEventLogger","Ga4EventExporter","PushToDataLayer","ga4Event","ecommerce","BroadcastChannel","ConsoleLog","message","prefix","color","bgColor","Log","CheckLogStatus","EnableLog","DisableLog","ToggleImpressionVisualizer","PrintEventLayer","HidePrintedEventLayer","RunEventConsumer","DisplayEventMessage","BroadcastToLogger","GetCurrentTime","now","Date","getHours","getMinutes","getSeconds","getMilliseconds","FeatureNames","EventTracking","Features","FeatureIsActive","featureName","hasAttribute","KlaviyoEventExporter","PushToKlaviyo","identify","IdentifyUser","klaviyoEvent","emailToRegister","Easyfy","ServiceNames","Stats","Ga4","Klaviyo","PageView","ProductClick","ProductPageView","BannerClick","ElementClick","AddToCart","RemoveFromCart","QuantityChanged","StartedCheckout","CompletedCheckout","SearchPerformed","ContinueToPayment","SessionStarted","LoggedIn","LoggedOut","Message","FetchClientMetaData","BlockStatsApi","SessionTimer","Modules","EasyfyEventHandler","constructor","eventMappers","eventExporters","Map","observedElements","initiated","instance","featureFlag","EasyfyEventLayerInstance","eventExporter","CheckSessionStart","then","RunEvents","InitProductIntersectionObserver","InitMutationObserver","InitBannerIntersectionObserver","InitElementIntersectionObserver","ClickEventChecker","inlineScript","RunEvent","sessionTimer","toUTCString","SendStartSessionEvent","checkTime","diff","getTime","abs","round","oldSessionId","response","fetch","ok","status","clientMetaData","json","sessionId","clientId","isDesktop","isMobilePhone","isTablet","userIdCookieKey","ipAddress","HandleWorkerMessage","clientData","Culture","Currency","RecurringUser","Referrer","referrer","Path","location","pathname","UserAgent","userAgent","VisitorId","sessionStartedEvent","options","childList","subtree","characterData","targets","mutationObserver","MutationObserver","ElementMutated","observe","mutations","mutation","RebindObserveProducts","BannerElementMutated","RebindObserveBanners","intersectionObserver","IntersectionObserver","ProductCardObserved","root","rootMargin","threshold","bannerIntersectionObserver","BannerElementObserved","TrackableElementObserved","disconnect","entries","observer","eventProductIds","eventProductSalesUnitCodes","listIds","promotedProducts","entry","isIntersecting","unobserve","getAttribute","productIdentifier","elementIdentifier","defaultSalesUnitCode","isPromotedProduct","node","parentElement","listId","nodeName","productIdentifiers","salesUnitCodes","bannerIds","bannerIdentifier","elements","trackType","properties","attribute","getAttributeNames","Id","Type","Properties","closest","targetUrl","href","ClickEventProduct","ClickEventBanner","ClickEventElement","stopPropagation","preventDefault","salesUnitCode","bannerId","elementId","dataset","removeAttribute","GetCurrentInstance","dispatchedToServices","errors","join","RegisterResponseData","responseData","eventLayer","GetCookie","Ga4DataMapper","mappedEvent","ViewItemListEvent","SelectItemEvent","ViewItemEvent","ViewPromotionEvent","SelectBannerPromotionEvent","AddToCartEvent","RemoveFromCartEvent","StartedCheckoutEvent","ContinueToPaymentEvent","CompletedCheckoutEvent","ViewCartEvent","ExpandConsentEvent","Error","priceIds","siteInfo","viewedProductItems","promotedProductEvents","eventProducts","eventPrices","salesUnitPrice","productListIndex","discount","variant","coupon","priceExVat","item_list_name","item_variant","item_id","item_name","DisplayName","item_brand","Brand","item_category","Categories","item_category2","item_category3","item_category4","item_category5","quantity","cd_flavour","Flavour","cd_format","Format","cd_product_type","ProductType","cd_packsize","packSize","gaEvent","currency","items","cd_timestamp","GetTimeStamp","ga4item","ga4items","item_list_id","banner","promotion_id","promotion_name","cd_linkUrl","LinkUrl","cd_pageUrl","PageUrl","creative_name","creative_slot","ListId","cd_add","checkoutProducts","checkoutProduct","qty","shippingTier","cd_campaign_code","CampaignCode","shipping_tier","Code","checkoutCompletedProducts","userConsents","trueConsents","keys","filter","purchaseFlow","cd_purchase_flow","transaction_id","completedCheckoutId","totalPriceExVat","tax","totalVatAmount","shipping","email_consent","rows","row","interaction_section","toUpperCase","toISOString","StatsDataMapper","BuildSessionStartedEvent","BuildPageViewEvent","BuildProductPageViewEvent","BuildSearchPerformedEvent","isFirstAddForRow","BuildAddToBasketEvent","isLastRemoveForRow","BuildRemoveFromBasketEvent","BuildQuantityChangedEvent","BuildProductImpressionEvents","TimeStampUtc","GetFormattedTimeStamp","GetCurrentUrlPath","PageId","pageId","ProductId","DomainId","SearchWord","searchString","Quantity","LineNumber","rowId","ListPosition","ListType","Origin","PageType","View","ViewName","Sku","NewQuantity","newQuantity","OldQuantity","oldQuantity","Url","productImpressions","KlaviyoDataMapper","PageViewEvent","LoggedInEvent","LoggedOutEvent","ProductName","ProductID","Price","PriceExVat","FullPath","itemNames","basketProduct","SKU","ItemPrice","RowTotal","ProductURL","AbsoluteProductUrl","ImageURL","ProductImageUrl","ProductCategories","lastItem","$value","priceIncVat","AddedItemProductName","AddedItemProductID","AddedItemSKU","AddedItemCategories","AddedItemImageURL","AddedItemURL","AddedItemPrice","AddedItemQuantity","ItemNames","CheckoutURL","checkoutPath","Items","categories","Set","checkoutValue","from","values","registeredCustomerEmail","email","Shared","Scripts","gtmEvent","PushProductImpressionEvent","impressions","PushProductClickEvent","click","actionField","list","ListNameCleanUp","PushProductDetailEvent","PushProductAddEvent","PushProductRemoveEvent","PushCheckoutEvent","step","option","checkout","HandleDataEvents","dataLayer","BuildAndPushEvents","dataEvents","dataEvent","dataProduct","brand","category","dimension3","dimension4","dimension5","dimension7","clickProducts","clickProduct","position","dimension6","impressionProducts","impressionProduct","detailProducts","detailProduct","console","dir","listname","generateFullPathWithPrefix","url","prefixPath","documentElement","endsWith","slice","config","axios","defaults","headers","common","post","token","patch","axiosDelete","delete","Web","Services","Search","GetFocusInData","SearchConfig","thresholdVolume","displayStyle","ThresholdVolume","DisplayStyle","campaignResults","popularResults","focusInCampaignData","focusInPopularData","Instance","OnInit","onSearch","CloseSearch","onSearchSuggestion","onSearchOpen","ShouldSearchBasedOnUserInput","pendingSearch","ShouldHideSearchBasedOnUserInput","ShouldGetFocusInData","showPopularResultsOnFocusIn","showCampaignsOnFocusIn","SearchClear","HideSearchResult","HideBackdrop","searchInput","blur","overflow","searchIcon","SearchBarInFocus","IsEventTargetInsideSearch","searchResults","searchBarElement","ShowSearchResult","backdrop","ShowBackdrop","contains","fromEl","searchInputElement","initNewSearchInstance","initialized","focus","targetAttrs","GetSearchDataBasedOnUserInput","keepPopularResultsOnSearch","keepCampaignProductsOnSearch","newValue","interval","searchData","includeArticles","includeBrands","includePages","includeProductSeries","subscriptionProductsOnly","searchTerm","subscriptionInterval","preventSubmit","success","partial","showPopularResultsIfNoResults","focusInParams","GetPopularResults","GetCampaignResults","partialCampaignResults","partialPopularResults","searchBar","searchForm","keepCampaignsOnSearch","innerWidth","preventEmptySearch","hideSearchEventListener","once","Inline","PostForm","Toaster","cssClass","CssClass","onRemoveToaster","toaster","severity","timeBeforeRemoved","basketOpen","extraClass","icon","doNotShowRemove","content","MessageSeverity","setAttribute","append","appendChild","Form","onPostForm","onPrePostAction","FormData","dataUpdate","datamessageContainer","messageContainer","updateContainer","container","hiddenValue","extraToggleEvent","overlayElement","reload","form","validationMethod","submit","IPurchaseType","UpsellKey","UpdateBasket","GetBasket","AddToCartState","animationEnded","setCookie","contentCookie","expirationDate","expirationTime","hostname","deleteCookie","expiration","setTime","replaceContent","clearData","createRange","createContextualFragment","firstElementChild","after","SnackBar","onToggleElement","snackbar","SnackbarSeverity","appendSnackbar","snackBarMessage","snackbarSeverity","snackBarIcon","PriceHelper","calculateNewRowPriceInVat","basketRow","unitPrice","getPriceDetails","updateAndFormatPrice","input","newPrice","locale","match","_","prefixSymbol","spaceBefore","originalPrice","spaceAfter","suffixSymbol","formattedPrice","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","format","rowPriceElement","unitPriceElement","packSizeElement","rowPriceInVat","parseCurrencyToFloat","currencyString","numericPart","parseFloat","onAddToCart","state","Processing","quantityInput","parseInt","headerBasket","hasSubscription","optionid","searchProductId","searchproductid","upsellid","UpsellId","productid","salesunitcode","changeQty","trackingData","originatedFromListName","originatedFromListId","searchProductOrigin","subscriptionOptions","optionId","renderBasket","elementState","Fail","Success","updateSubscriptionFlyout","catch","innerText","onBasketRowChange","basketButtons","rowid","subscriptionOptionId","subscriptionoptionid","onBasketRowSet","setQty","onBasketRowRemove","scrollPos","scrollTop","miniBasket","priceElement","quantityElement","headerCheckout","totalQuantity","priceIncVatExclDiscountExclShipping","basketText","basketContentElNew","scrollTo","changeQuantity","increase","parentContainer","stepUp","stepDown","flyoutCloseBtn","freqSelector","updateFreqFlyout","updateflyout","updateFlyoutEvent","bubbles","cancelable","onDecreaseQuantity","onIncreaseQuantity","getBasket","BreadCrumb","breadCrumbs","breadCrumbBlurbox","handleScrollEvent","scrollLocation","scrollLeft","scrollDiff","clientWidth","scrollWidth","setProperty","Menu","activeMenu","navHeader","scrollMainNav","direction","scrollRight","leftArrow","rightArrow","scroll","scrollPosition","leftToScroll","VISIBLE_CLASS_NAME","scrollBy","left","behavior","toggleMenuChildren","addBreadCrumbMenuItem","childElement","updateMenuBreadcrumbs","activeElement","registerMenuScroll","menuGoBack","parent","removeBreadCrumbLastMenuItem","determineShadowLocation","scrollHeight","clientHeight","savedBreadcrumbsList","updateMenuStyle","navList","navItems","updated","navItem","offsetTop","height","innerHeight","passive","breadcrumbContainers","menuItem","isLast","spanElement","textContent","chevronElement","menu","pop","CountrySelector","showCountries","countryList","hasClass","closeOnEvent","removeEventListeners","Header","header","mainSection","sticky","menuItems","toggleLoginFlyout","openModals","flyoutExists","modal","removeFlyoutEvents","partialHtml","insertAdjacentHTML","overlay","isLoginRequest","invokeOpenLoginFlyout","loginButton","onScroll","timer","scrollY","Dropdown","sliderTranslate","createLink","link","productInfo","removeSelectedVariant","selectedVariant","updateBuyButtonValue","buyButtons","upsellId","button","updateFlagVisibility","flags","flag","updateHtml","isSearch","priceContainer","newPacksize","pricehtml","packsize","packsizehtml","updateProductPageActionInfo","prodPageActionElement","variants","selectedPackSize","selectedPrice","disableSlider","slider","enableSlider","onSortOptionClick","onVariantSelectorToggle","onVariantSelectorOptionClick","closeVariantSelector","optionValue","optionText","selectedElement","customEvent","isCompact","salesunitContainer","appendToBody","menuClone","cloneNode","openProductCard","isProductCardCompact","Toggle","hideToggle","onToggleList","targetList","targetElements","divs","hiddenInput","toggleElements","targetsToHide","onlymobile","listEl","getReturnUrl","URL","params","URLSearchParams","search","onTogglePassword","pwdEl","pwdInput","showIcon","onPasswordInput","inputEl","updateRequirement","test","handleFormValidation","onConfirmPasswordInput","confirmPassword","password","processPartial","dataPartial","resetErrorMessages","setErrorMessages","errorMessages","propertyName","inputContainer","errorMessage","setValidationSummary","validationSummaryContainer","validationErrors","isFormValid","valid","requirement","getElementById","onPostHayppForm","tokenEl","partials","clearForm","reset","generalErrorMessage","LogOut","ms","onLogOut","log","AgeGate","checkCookie","checkIfActiveFeature","loadAgeGate","acceptAgeGate","ageGate","OptionSelector","selectVariant","selectedOptionId","getSelectedOption","updateProductPageWithSelectedOption","prodContainerEl","prodRecommendationsEl","prodContainerHtml","partialHtmlProdContainer","prodRecommendationsHtml","partialHtmlProdRecommendations","updateProdListEvt","hash","selectFrequency","updateSubscriptionData","selectSalesUnit","checkEnableButton","newInterval","originalInterval","optioninterval","disabled","updateFrequency","selectedOptionInterval","frequencyFlyout","productFlyout","selectedOption","selectedOptionIntervalName","addToCartBtn","selectedFrequency","dataKeys","optionEl","parentEl","updateSelectedAttr","updateButtonsData","selected","flyoutEl","dataKey","selectedOptionDataValue","SubscriptionHelper","loadSubscriptionFlyout","variantId","flyout","GetSubscriptionFlyoutViewForProductList","res","CountryPopup","countryPopup","getCountryPopup","country","GetCountryPopupModal","confirmationDialogHtml","closeCountryPopup","date","setFullYear","getFullYear","getCookieName","isCountryPopupDismissed","COOKIE_NAME","Global","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","every","r","n","__esModule","d","a","definition","o","Symbol","toStringTag","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","self","__webpack_exports__"],"sourceRoot":""}