{"version":3,"file":"marketing-xxxxxxxxxxxxxxxxxxxx.js","mappings":"6GAAA,IAAIA,EAAM,CACT,sCAAuC,KACvC,yBAA0B,IAC1B,wBAAyB,KACzB,iCAAkC,KAClC,iCAAkC,KAClC,qCAAsC,KACtC,uCAAwC,KACxC,gCAAiC,KACjC,oCAAqC,KACrC,6DAA8D,KAC9D,gDAAiD,IACjD,+CAAgD,KAChD,wDAAyD,KACzD,wDAAyD,KACzD,4DAA6D,KAC7D,8DAA+D,KAC/D,uDAAwD,KACxD,2DAA4D,KAC5D,yDAA0D,KAC1D,4CAA6C,IAC7C,2CAA4C,KAC5C,oDAAqD,KACrD,oDAAqD,KACrD,wDAAyD,KACzD,0DAA2D,KAC3D,mDAAoD,KACpD,uDAAwD,MAIzD,SAASC,EAAeC,GACvB,IAAIC,EAAKC,EAAsBF,GAC/B,OAAOG,EAAoBF,EAC5B,CACA,SAASC,EAAsBF,GAC9B,IAAIG,EAAoBC,EAAEN,EAAKE,GAAM,CACpC,IAAIK,EAAI,IAAIC,MAAM,uBAAyBN,EAAM,KAEjD,MADAK,EAAEE,KAAO,mBACHF,CACP,CACA,OAAOP,EAAIE,EACZ,CACAD,EAAeS,KAAO,WACrB,OAAOC,OAAOD,KAAKV,EACpB,EACAC,EAAeW,QAAUR,EACzBS,EAAOC,QAAUb,EACjBA,EAAeE,GAAK,I,+DChDPY,EAAa,SAAAC,GACxB,MAA4B,YAAxBC,SAASC,WACJC,WAAWH,EAAU,GAErBC,SAASG,iBAAiB,oBAAoB,kBAAMJ,GAAU,GAEzE,ECHAD,GAAW,WACT,IAAMM,EAAOJ,SAASK,cAAc,QAC9BC,EAAYN,SAASK,cAAc,cACnCE,EAAaP,SAASK,cAAc,eACpCG,EAAiBR,SAASK,cAAc,oBAE9C,SAASI,IACPF,EAAWG,UAAUC,OAAO,WAC5BH,EAAeI,oBACb,gBACAH,EAEJ,CAuBIH,GACFA,EAAUH,iBAAiB,SAtBR,WACnBC,EAAKM,UAAUG,OAAO,mBACtBP,EAAUI,UAAUG,OAAO,QAETN,EAAWG,UAAUI,SAAS,YAG9CN,EAAeL,iBACb,gBACAM,GAEFD,EAAeE,UAAUC,OAAO,aAEhCJ,EAAWG,UAAUK,IAAI,WAEzBb,YAAW,WACTM,EAAeE,UAAUK,IAAI,UAC/B,GAAG,KAEP,KAaAC,EAAAA,EAAAA,IACE,QAAO,uGART,WACEZ,EAAKM,UAAUC,OAAO,mBACtBL,EAAUI,UAAUC,OAAO,QAC3BH,EAAeL,iBAAiB,gBAAiBM,GACjDD,EAAeE,UAAUC,OAAO,UAClC,GAOF,I,sBCnDAM,OAAOC,eAAiBA,EAAAA,ECDxBpB,GAAW,WAGT,SAASqB,EAAgB,GAA2B,IAAVC,EAAM,EAArBC,cACnBC,EAAsD,SAAzCF,EAAOG,aAAa,iBACjCC,EAAWF,EAAa,QAAU,OAElCG,EAAUL,EAAOM,mBACjBC,EAAgBF,EAAQG,aAExBC,GAAmC,KAAhBF,GAAsBG,QAAQ,GAEvDL,EAAQM,MAAMC,WAAa,cAAH,OAAiBH,EAAe,gCAAwBA,EAAe,eAC/FJ,EAAQM,MAAME,UAAYX,EAAa,KAAO,GAAH,OAAMK,EAAa,MAE9DP,EAAOc,aAAa,gBAAiBV,EACvC,CAfcxB,SAASmC,iBAAiB,4BAiBlCC,SAAQ,SAAAC,GAAI,OAAIA,EAAKlC,iBAAiB,QAASgB,EAAgB,GACvE,I,QCTA,QAZiB,SAACpB,GAAyB,IAAfuC,EAAO,UAAH,6CAAG,IAC7BC,EAAY,KAEhB,OAAO,WAAa,2BAATC,EAAI,yBAAJA,EAAI,gBACbvB,OAAOwB,aAAaF,GAEpBA,EAAYtB,OAAOf,YAAW,WAC5BH,EAAS2C,MAAM,KAAMF,EACvB,GAAGF,EACL,CACF,E,ICVIK,E,UCWJ,QAXkB,WAChB,IAAMC,EAAU5C,SAAS6C,KAAKxC,cAC5B,oCAEF,OAAIuC,EACKA,EAAQrB,aAAa,WAGvB,IACT,ECJA,IAAMuB,EAAe,CAAC,OAAQ,OAOxBC,EAAWC,EAAAA,GAAMC,OAAO,CAC5BC,iBAAiB,EACjBC,QAAS,KAAF,OAAOC,OAGhBL,EAASM,aAAaC,QAAQC,KAC5B,SAAAC,GAXgC,IAAGC,EAejC,OAfiCA,EAYHD,EAZGC,UAE3BX,EAAaY,SAASD,EAAOE,iBAWjCH,EAAOI,QAAQ,gBFlBd,WACL,GAAIjB,EAAW,OAAOA,EAEtB,IAAMkB,EAAW7D,SAAS6C,KAAKxC,cAAc,8BAC7C,OAAQsC,EAAYkB,EAAWA,EAASpC,QAAU,EACpD,CEauCqC,IAE5BN,CACT,IACA,SAAAO,GACE,OAAOC,QAAQC,OAAOF,EACxB,IAGF,UCzBA,IAGaG,EAAa,SAACC,EAAOC,GAKhC,OAAOpB,EAAMqB,KAAK,iBAAkB,CAClCF,MAAAA,EACAC,QAAAA,GAEJ,EChBaE,EAAU,SAAAC,GACrB,IAAMC,EAAQ,IAAIC,IAClB,OAAO,WAAa,2BAATjC,EAAI,yBAAJA,EAAI,gBACb,IAAMkC,EAAOC,KAAKC,UAAUpC,GACtBqC,EAASL,EAAMM,IAAIJ,GACzB,MAAsB,qBAAXG,EACFA,GAGTL,EAAMO,IACJL,EACAH,EAAE,aAAI/B,GAAK,OAAO,SAAAwC,GAEhB,MADAR,EAAK,OAAQE,GACPM,CACR,KAEKR,EAAMM,IAAIJ,GACnB,CACF,ECZMO,EAAcX,GAFI,WAAH,OAAStB,EAAM8B,IAAI,qBAAoB,OAAO,kBAAM,IAAI,GAAC,ICFxEI,EAA2B,SAAAC,GAC/B,IAAMC,EAAyBD,EAAgBE,cAEzCC,EAAcF,EAAuB/E,cACzC,sCAEIkF,EAAcH,EAAuB/E,cACzC,sCAEImF,EAAiBJ,EAAuB/E,cAC5C,kCAGIoF,EAAwC,IAA9BN,EAAgBO,UAC1BC,EACJR,EAAgBO,UAAYP,EAAgBS,aAAe,GAC3DT,EAAgBvD,aAEZiE,EACJV,EAAgBvD,cAAgBuD,EAAgBS,aAElDN,EAAY5E,UAAUG,OAAO,yBAA0B4E,GACvDF,EAAY7E,UAAUG,OAAO,yBAA0B8E,GACvDH,EAAe9E,UAAUG,OACvB,wCACAgF,GAEFT,EAAuB1E,UAAUG,OAAO,YAAagF,EACvD,EAEA/F,GAAW,WACT,IAAIgG,EAIEC,EAAiB,SAACnD,EAASoD,GAC/BC,IACAH,EAAiBI,aAAY,WAC3BC,EAASvD,EAASoD,EACpB,GAAG,IACL,EAEMC,EAAgB,WACpBG,cAAcN,EAChB,EAEMK,EAAW,SAACvD,EAASoD,GACzB,IAAMK,EAAgC,OAAdL,GAdL,QAenBpD,EAAQ0D,SAAS,CACfC,IAAKF,EACLG,SAAU,UAEd,EAEMC,EAAYzG,SAASmC,iBAAiB,wBAEvCsE,EAAUC,QAEfD,EAAUrE,SAAQ,SAAA+C,GAChB,IAAMG,EAAcH,EAAgBE,cAAchF,cAChD,sCAEIkF,EAAcJ,EAAgBE,cAAchF,cAChD,sCAEImF,EAAiBL,EAAgBE,cAAchF,cACnD,kCAGGiF,GAAgBC,GAAgBC,IAErCF,EAAYnF,iBAAiB,aAAa,WACxC4F,EAAeZ,EAAiB,KAClC,IAEAG,EAAYnF,iBAAiB,UAAW8F,GAExCV,EAAYpF,iBAAiB,aAAa,WACxC4F,EAAeZ,EAAiB,OAClC,IAEAI,EAAYpF,iBAAiB,UAAW8F,GAExCX,EAAYnF,iBAAiB,SAAS,WACpCgG,EAAShB,EAAiB,KAC5B,IAEAI,EAAYpF,iBAAiB,SAAS,WACpCgG,EAAShB,EAAiB,OAC5B,IAEAA,EAAgBhF,iBAAiB,UAAU,WACzC+E,EAAyBC,EAC3B,IAEAD,EAAyBC,GAC3B,GACF,IAEA,U,mdC/FA,IAAMwB,EAAmB,gCACnBC,EAAkB,iBAClBC,EAAiB,wBACjBC,EAAe,YACfC,EAAsB,sBAEtBC,EAAwB,SAExBC,EAAqB,kBAIrBC,EAAoB,eACpBC,EAAwB,mBAExBC,GAAS,OACZF,EAAoB,oBAAkB,IACtCC,EAAwB,6BAA2B,GAGhDE,GAAU,OACbH,EAAoB,eAAa,IACjCC,EAAwB,0BAAwB,GAG7CG,EAAe,WACnB,OAAIrG,OAAOsG,WAAW,sBAAsBC,QACnC,GAELvG,OAAOsG,WAAW,uBAAuBC,QACpC,GAEFC,GACT,EAEMC,EAAe,CAAC,EAChBC,EAAY,CAAC,EACbC,EAAa,CAAC,EAEdC,EAAqB,CAAC,EACtBC,EAA2B,CAAC,EAC5BC,EAAqB,CAAC,EAE5B,SAASC,EAAUC,GACjB,IAAMC,EAAY,IAAIC,gBAElBR,EAAUM,IACZC,EAAUnD,IAAI,OAAD,OAAQkD,GAAcN,EAAUM,IAG/CL,EAAWK,GAAY7F,SAAQ,SAAAgG,GAAI,OACjCF,EAAUG,OAAO,QAAD,OAASJ,GAAcG,EAAK,IAG9CnH,OAAOqH,QAAQC,aAAa,KAAM,GAAI,IAAF,OAAML,EAAUM,YACtD,CAEA,SAASC,EAAWR,GAClB,IAAMS,EAAU1I,SAASK,cAAc,mDAAD,OACe4H,EAAU,MAE/D,GAAKS,EAAL,CAEAZ,EAAyBG,GAAc,EACvCF,EAAmBE,GAAc,EAEjC,IAAMU,EAAQC,MAAMC,KAAKH,EAAQvG,iBAAiB,iBAC5C2G,EAAaJ,EAAQK,QAAQC,YAEnCL,EAAMvG,SAAQ,SAAAC,GACZ,MAKIA,EAAK0G,QAJPE,EAAK,EAALA,MACKC,EAAO,EAAZC,IACMC,EAAQ,EAAdhB,KACSiB,EAAO,EAAhBA,QAGIC,EAAgBL,EACnBtF,cACA4F,OACA7F,SAASgE,EAAaO,IACnBuB,EAAWN,EAAUA,EAAQO,MAAM,KAAO,GAE1CC,GACH/B,EAAUM,IACe,QAA1BN,EAAUM,IACVuB,EAAS9F,SAASiE,EAAUM,IAExB0B,EAC8B,IAAlC/B,EAAWK,GAAYvB,QACvBkB,EAAWK,GAAYvE,SAAS0F,GAC5BQ,EAAYP,GAAWA,EAAQ3F,SAASoF,GACxCe,EAAyC,YAA1BlC,EAAUM,GACbqB,GAAiBK,IACPE,EAAeD,EAAYF,IAInD5B,EAAyBG,GAAcJ,EAAmBI,IAE1D5F,EAAK3B,UAAUC,OAAOqG,GACtBc,EAAyBG,MAEzB5F,EAAK3B,UAAUK,IAAIiG,GAErBe,EAAmBE,MAEnB5F,EAAK3B,UAAUK,IAAIiG,EAEvB,IAEA,IAAM8C,EAAUnB,EAAMoB,OAAM,SAAA1H,GAAI,OAC9BA,EAAK3B,UAAUI,SAASkG,EAAsB,IAEhD0B,EAAQhI,UAAUG,OAAO,WAAYiJ,GAErC,IAAME,EACJjC,EAAmBE,GAAcJ,EAAmBI,GACtDS,EAAQrI,cAAc4G,GAAoBlF,MAAMkI,QAC9CD,EAAiB,EAAI,cAAgB,OAEvC,IAAME,EAAexB,EAAQrI,cAAc,sBAS3C,GARI6J,IACFA,EAAaC,YAAczC,EAAaO,GAAW,qCACtBP,EAAaO,GAAW,oBAAYZ,EAAWY,GAAW,SACnF,yCAGNS,EAAQK,QAAQqB,SAAWC,QAAQ3C,EAAaO,IAE5CA,GAAcd,EAAuB,CACvC,IAAMhC,EAAkBnF,SAASK,cAC/B,yCAGF6E,EAAyBC,EAC3B,CA3EoB,CA4EtB,CAEA,IAAMmF,EAAgB,WACpB,IAAMC,EAAQvK,SAASK,cACrB,wEAEEkK,GACFA,EAAMC,eAAe,CAAEhE,SAAU,SAAUiE,MAAO,SAEtD,EAEA,SAASC,EAAYpL,EAAG2I,GACtBN,EAAUM,GAAc3I,EAAEqL,OAAOC,MACjCnC,EAAWR,GACXqC,GACF,CAEA,SAASO,EAAqBvL,GAC5B,OAAOA,EAAEqL,OAAOG,QAAQnE,GAAkBoC,QAAQd,UACpD,EAEAjH,EAAAA,EAAAA,IACE,QACA4F,EACAmE,GAAS,SAAAzL,GAAK,QACN2I,EAAa4C,EAAqBvL,GACxCoI,EAAaO,GAA4B,QAAjB,EAAG3I,EAAEqL,OAAOC,aAAK,OAAe,QAAf,EAAd,EAAgBjH,qBAAa,WAAf,EAAd,EAA+B4F,OAC1Dd,EAAWR,GACX/D,EAAW,GAAD,OAAIkD,EAAUa,GAAW,WAAW,CAC5C+C,KAAMtD,EAAaO,IAEvB,MAGFjH,EAAAA,EAAAA,IAAG,SAAU,uBAAuB,SAAA1B,GAClCA,EAAE2L,gBACJ,KAEAjK,EAAAA,EAAAA,IAAG,SAAU8F,GAAc,SAAAxH,GACzB,IAAM2I,EAAa4C,EAAqBvL,GACxCqI,EAAUM,GAAc3I,EAAEqL,OAAOC,MACjCF,EAAYpL,EAAG2I,GACfD,EAAUC,GACV/D,EAAW,GAAD,OAAIkD,EAAUa,GAAW,sBAAsB,CACvD+C,KAAMrD,EAAUM,IAEpB,KAEAjH,EAAAA,EAAAA,IAAG,SAAU+F,GAAqB,SAAAzH,GAChC,IAAM2I,EAAa4C,EAAqBvL,GACxCqI,EAAUM,GAAc3I,EAAEqL,OAAOC,MACjCF,EAAYpL,EAAG2I,GACfD,EAAUC,GACV/D,EAAW,GAAD,OAAIkD,EAAUa,GAAW,sBAAsB,CACvD+C,KAAMrD,EAAUM,IAEpB,KAEAjH,EAAAA,EAAAA,IAAG,SAAU6F,GAAgB,SAAAvH,GAC3B,IAAM2I,EAAa4C,EAAqBvL,GACxCsI,EAAWK,GAAcW,MAAMC,KAC7BvJ,EAAEqL,OAAOG,QAAQnE,GAAkBxE,iBAAiB0E,IAEnDqE,QAAO,SAAAC,GAAC,OAAIA,EAAEC,OAAO,IACrBrM,KAAI,SAAAoM,GAAC,OAAIA,EAAEP,KAAK,IACnB5C,EAAUC,GACVQ,EAAWR,GACXqC,IACApG,EAAW,GAAD,OAAIkD,EAAUa,GAAW,kBAAkB,CACnD+C,KAAMpD,EAAWK,GAAYoD,KAAK,OAEtC,KAEArK,EAAAA,EAAAA,IAAG,QAASiG,GAAoB,SAAA3H,GAC9B,IAAM2I,EAAa4C,EAAqBvL,GACxCuI,EAAmBI,IAAeX,IAClCmB,EAAWR,EACb,IAEAnI,GAAW,WACT,IAAMwL,EAAWtL,SAASmC,iBAAiBwE,GACtC2E,GAELA,EAASlJ,SAAQ,SAAAsG,GACf,IAAMT,EAAaS,EAAQK,QAAQd,WAC7BC,EAAY,IAAIC,gBAAgBlH,OAAOsK,SAASC,QAEtD9D,EAAaO,GAAc,GACvBA,GAAcf,IAChBS,EAAUM,GACRC,EAAUpD,IAAI,OAAD,OAAQmD,KAzNH,OA2NtBL,EAAWK,GAAcC,EAAUuD,OAAO,QAAD,OAASxD,IAAcvB,OAC5DwB,EAAUuD,OAAO,QAAD,OAASxD,IACzB,GAEJ,IAAMyD,EAAgBhD,EAAQrI,cAAcuG,GACxC8E,IACFA,EAAcd,MAAQ,IAGDhC,MAAMC,KAAKH,EAAQvG,iBAAiB0E,IAE5CzE,SAAQ,SAAAuJ,GACrBA,EAAGP,QAAUxD,EAAWK,GAAYvE,SAASiI,EAAGf,MAClD,IAEA,IAAMgB,EAAclD,EAAQrI,cAAc,GAAD,OACpCyG,EAAY,mBAAWa,EAAUM,GAAW,OAE7C2D,IACFA,EAAYR,SAAU,GAGxB,IAAMS,EAAoBnD,EAAQrI,cAAc0G,GAC5C8E,IACFA,EAAkBjB,MAAQjD,EAAUM,IAGtCJ,EAAmBI,GAAcX,IAEjCmB,EAAWR,EACb,GACF,ICxQA,IAAM6D,EAAoB,mCAEpBC,EAAkB,mBAClBC,EAAqB,uBAErBC,EAAmB,SACnBC,EAA+B,sBAE/BC,EAAoBnM,SAASK,cAAc2L,GAC3CI,EAAUpM,SAASmC,iBAAiB2J,GACpCO,EAAWrM,SAASmC,iBATF,uBAWlBmK,GAAiBrL,OAAOsG,WAAW,uBAAuBC,QAE1D+E,GAASvM,SAASK,cAAc,WAEhCmM,GAA4B,WACP,CACvB,IACA,2BACA,sBACA,4BAGmB9I,SAASzC,OAAOsK,SAASkB,WAC5CF,GAAO7L,UAAUK,IAAImL,EAEzB,EAEMQ,GAAuC,WAC3C,IAAMC,EACoE,OAAxE3M,SAASK,cAAc,GAAD,OAAI2L,EAAkB,YAAIC,IAE9ChL,OAAO2L,QAAU,EACnBL,GAAO7L,UAAUC,OAAOuL,GACdS,GACVH,IAEJ,EAEMK,GAAmB,WACvBR,EAASjK,SAAQ,SAAA0K,GACfA,EAAQ/K,MAAME,UAAY,EAC5B,IAEAmK,EAAQhK,SAAQ,SAAAhB,GACdA,EAAO0J,QAAQiB,GAAiBrL,UAAUC,OAAOsL,EACnD,GACF,GAsDAjL,EAAAA,EAAAA,IAAG,QAAS8K,GAtCc,SAAA3H,GACxB,IAAM4I,EAAa5I,EAAMwG,OAAOG,QAAQiB,GAClCiB,EAAc7I,EAAMwG,OAAOjJ,mBAC3BuL,EAAWF,EAAWrM,UAAUI,SAASmL,GACzCtK,EAAgBqL,EAAYpL,aAE5BsL,EACJtE,MAAMC,KACJ7I,SAASmC,iBAAiB,GAAD,OAAI4J,EAAe,YAAIE,KAChDvF,OAAS,EAET4F,IAAkBY,IACpBb,EAASjK,SAAQ,SAAA0K,GACfA,EAAQ/K,MAAMC,WAAaiL,EAAW,GAAK,MAC7C,IAEAd,EAAkBzL,UAAUC,OAAOsL,GAEZ,IAAnBhL,OAAO2L,SACTJ,MAIJK,KAEKI,IACHF,EAAWrM,UAAUK,IAAIkL,GACzBe,EAAYjL,MAAME,UAAY,GAAH,OAAMN,EAAa,MAE1C2K,IACFH,EAAkBzL,UAAUK,IAAIkL,GAEX,IAAnBhL,OAAO2L,SACTL,GAAO7L,UAAUC,OAAOuL,GAG9B,KAIAlL,EAAAA,EAAAA,IACE,QAAO,8CACgCgL,IAxDjB,WACtBK,EAASjK,SAAQ,SAAA0K,GACfA,EAAQ/K,MAAMC,WAAa,EAC7B,IAEAmK,EAAkBzL,UAAUC,OAAOsL,GAEnCY,KAEuB,IAAnB5L,OAAO2L,SACTJ,IAEJ,IAgDA1M,GAAW,WACT,IAAIqN,EAAOlM,OAAOsK,SAASkB,SACX7D,MAAMC,KAAK7I,SAASmC,iBAAiB,kBAE3CC,SAAQ,SAAAgL,GACZA,EAAK7L,aAAa,UAAY4L,GAChCC,EAAK1M,UAAUK,IAAI,SAEvB,IAEAyL,KAEAvL,OAAOd,iBAAiB,SAAUuM,GACpC,IC1HA,IAAMW,GAAuB,eACvBC,GAA6B,sBAC7BC,GAA8B,uBAC9BC,GAAgC,yBAEhCC,GAA+B,sBAE/BC,GAA8B,uBAC9BC,GAA4B,qBAmBlC,SAASC,GAAiBC,GACxB,IAAMC,EAAcD,EAASxN,cAAcqN,IACvCI,IACFA,EAAYlD,MAAQ,GAENiD,EAAS1L,iBAAiBwL,IAClCvL,SAAQ,SAAAC,GACZA,EAAKN,MAAMkI,QAAU,EACvB,IAEJ,CAEA,SAAS8D,GAAiBC,GACxB,GAAI/M,OAAOsG,WAAW,uBAAuBC,QAAS,CACpD,IAAMsG,EAAcE,EAAY3N,cAAcqN,IAC1CI,GACFA,EAAYG,OAEhB,CACF,CA0BA,SAASC,GAAoBF,EAAaG,GACxC,IAAMC,EAAyBJ,EAAY3N,cACzCkN,IAEIc,EAAeD,EAAuB7M,aAAa,aACnD+M,EAAaN,EAAY7L,iBAC7BqL,GAAgC,YAGR,IAAtBc,EAAW5H,OACb0H,EAAuBjE,YAAc,OAAH,OAAUkE,GACb,IAAtBC,EAAW5H,OACpB0H,EAAuBjE,YAAcmE,EAAW,GAAG1D,MAEnDwD,EAAuBjE,YAAc,GAAH,OAAMmE,EAAW5H,OAAM,YAAI2H,EAAY,aAG3EF,EAAYhE,YAAc,aAAH,OACrBmE,EAAW5H,OAAS,IAAM4H,EAAW5H,OAAS,IAAM,GAExD,CAEO,SAAS6H,KACOvO,SAASmC,iBAAiBkL,IAClCjL,SAAQ,SAAA4L,GACnB,IAAMG,EAAcH,EAAY3N,cAAciN,IAC9CY,GAAoBF,EAAaG,EACnC,GACF,CAEA,SAASK,GAAcrK,GAA+B,IAAxBsK,EAAkB,UAAH,6CAAG,KAC9CtK,EAAM8G,iBACN,IAAM+C,EAAc7J,EAAMwG,OAAOG,QAAQuC,IACnCiB,EAAaN,EAAY7L,iBAC7BqL,GAAgC,YAE5BW,EAAcH,EAAY3N,cAAciN,IAE9CgB,EAAWlM,SAAQ,SAAAsM,GACbA,IAAaD,IACfC,EAAStD,SAAU,EAEvB,IAEA8C,GAAoBF,EAAaG,EACnC,C,44CAEAnN,EAAAA,EAAAA,IAAG,QAASuM,IAvEZ,SAAwBpJ,GACtB,IACMwK,EADiBxK,EAAMwG,OACOG,QAAQuC,IAC5CsB,EAAajO,UAAUG,OAAO4M,IAE1BkB,EAAajO,UAAUI,SAAS2M,IAClCM,GAAiBY,GAEjBf,GAAiBe,EAErB,IA8DA3O,SAASG,iBAAiB,SA5D1B,SAA8BgE,GAC5B,IAAMwG,EAASxG,EAAMwG,OACH3K,SAASmC,iBAAiBkL,IAElCjL,SAAQ,SAAAyL,GACXA,EAAS/M,SAAS6J,KACrBiD,GAAiBC,GACjBA,EAASnN,UAAUC,OAAO8M,IAE9B,GACF,KAoDAzM,EAAAA,EAAAA,IAAG,SAAUwM,IAA+B,SAAArJ,GAC1CA,EAAMyK,kBACN,IAAMC,EAAkB1K,EAAMwG,OAAOG,QAAQuC,IACvCc,EAAcU,EAAgBxO,cAAciN,IAEO,SAAvDuB,EAAgBtN,aAAa,uBAG7BiN,GAAcrK,EAAOA,EAAMwG,QAG7BuD,GAAoBW,EAAiBV,GACrCJ,GAAiBc,EACnB,KAEA7N,EAAAA,EAAAA,IAAG,QAASsM,GAA4BkB,IAExC1O,GAAW,WACTyO,IACF,KAEAvN,EAAAA,EAAAA,IAAG,QAAS0M,IArIZ,SAAsBvJ,GACpB,IAAM2K,EAAa3K,EAAMwG,OAAOC,MAAMjH,cAAc4F,OAChCpF,EAAMwG,OAAOG,QAAQuC,IACflL,iBAAiBwL,IAErCvL,SAAQ,SAAAC,GACCA,EACVhC,cAAc,sBACd8J,YAAYxG,cACND,SAASoL,GAChBzM,EAAKN,MAAMkI,QAAU,GAErB5H,EAAKN,MAAMkI,QAAU,MAEzB,GACF,ICrBA,IACMjD,GAAwB,oBAGxB+H,GAA+B,wBAC/BC,GAA0B,2BAE1B1H,GAAe,WACnB,OAAIrG,OAAOsG,WAAW,sBAAsBC,SAGxCvG,OAAOsG,WAAW,uBAAuBC,QAFpC,GAKF,CACT,EAEIyH,GAAoB3H,KACpB4H,GAAgB,GAChBC,GAAmB,GACnBC,GAAc,GACdC,GAAmB,GACnBC,GAAc,GACdC,GAAe,GAEnB,SAASvH,KACP,IAAME,EAAY,IAAIC,gBAElBgH,GAAiBzI,OAAS,GAC5BwB,EAAUG,OAAO,WAAY8G,GAAiB,IAG5CC,GAAY1I,OAAS,GACvB0I,GAAYhN,SAAQ,SAAAoN,GAClBtH,EAAUG,OAAO,SAAUmH,EAC7B,IAGEH,GAAiB3I,OAAS,GAC5B2I,GAAiBjN,SAAQ,SAAA4G,GACvBd,EAAUG,OAAO,cAAeW,EAClC,IAGF/H,OAAOqH,QAAQC,aAAa,KAAM,GAAI,IAAF,OAAML,EAAUM,YACtD,CAEA,IAOMiH,GAA2BzP,SAASK,cAAc,wBAClDqP,GAAgD,OAAxBD,SAAwB,IAAxBA,IAAAA,GAA0B1G,QAAQ4G,WAC5DhL,KAAKiL,MAAMH,GAAyB1G,QAAQ4G,YAC5C,KAEEE,GAAoBH,GACtBhQ,OAAOoQ,YACLpQ,OAAOqQ,QAAQL,IAAuB3Q,KAAI,0BAAEiR,EAAG,KAAEpF,EAAK,WAAM,CAC1DoF,EAAG,CACFA,GAAG,UAAMpF,EAAMqF,UAAY,KAC7B,KAEH,CAAC,EAyECxH,GAAa,WACjB,IAAMyH,EAAOlQ,SAASK,cAAc,0CACpC,GAAK6P,EAAL,CAEA,IA1BsBC,EAAYC,EA0B5BC,GA1BgBF,EA0Ba,GAAIZ,IA1BLa,EA0BoBjB,GAAiB,GAzBhEgB,EAAWG,MAAK,SAACC,EAAGC,GAAM,QACzBC,GACqB,QAAzB,EAAAF,EAAExH,QAAQ2H,uBAAe,aAAzB,EAA2BnH,OAAO5F,kBAClB,OAAhByM,QAAgB,IAAhBA,OAAgB,EAAhBA,EAAkB7G,OAAO5F,eACrBgN,GACqB,QAAzB,EAAAH,EAAEzH,QAAQ2H,uBAAe,aAAzB,EAA2BnH,OAAO5F,kBAClB,OAAhByM,QAAgB,IAAhBA,OAAgB,EAAhBA,EAAkB7G,OAAO5F,eAE3B,GAAI8M,IAAeE,EAAY,OAAOA,EAAaF,EAEnD,GAAIrB,GAAY1I,OAAS,EAAG,CAC1B,IAAMkK,GAC6B,IAAhCJ,EAAEK,WAAWC,QAAQpK,SACW,IAAhC6J,EAAEM,WAAWC,QAAQpK,QACxB,GAAIkK,EAAkB,OAAOA,CAC/B,CAEA,OAAOG,OAAOP,EAAEzH,QAAQiI,UAAYD,OAAOR,EAAExH,QAAQiI,SACvD,KASAd,EAAKe,UAAY,GAEjB,IAAIC,EAA0B,EAC1BC,EAAoB,EAoCxBd,EAAYjO,SAAQ,SAAAC,IAlCE,SAAAA,GACpB,MAKIA,EAAKwO,WAJP5H,EAAK,EAALA,MACYmI,EAAc,EAA1BzB,WACS0B,EAAW,EAApBP,QACcQ,EAAgB,EAA9BC,aAGIjI,GAAgBgG,GAAY5I,QAC9B,CAACuC,GAAK,UAAKoI,GAAW,GAAKC,IAAkBE,MAAK,SAAAC,GAAE,OAClDA,EAAG9N,cAAc4F,OAAO7F,SAAS4L,GAAY,IAI7CoC,GAAoBxC,GAAcxI,QACpCwI,GAAcsC,MAAK,SAAAnP,GAAI,OAAI+O,EAAe1N,SAASrB,EAAK,IAGtDsP,GAAiBvC,GAAY1I,QAC/B0I,GAAYoC,MAAK,SAAAnP,GAAI,OAAIgP,EAAY3N,SAASrB,EAAK,IAGjDuP,GAAsBvC,GAAiB3I,QACzC2I,GAAiBmC,MAAK,SAAAnP,GAAI,OAAIiP,EAAiB5N,SAASrB,EAAK,IAGjE,OACEiH,GACAoI,GACAC,GACAC,CAEJ,CAGMC,CAAcxP,GAUhBA,EAAK3B,UAAUK,IAAIiG,KATfkK,EAA0BjC,IAC5B5M,EAAK3B,UAAUC,OAAOqG,IACtBkK,KAEA7O,EAAK3B,UAAUK,IAAIiG,IAErBkJ,EAAK4B,YAAYzP,GACjB8O,IAIJ,IAEA,IAAMrH,EAAUuG,EAAYtG,OAAM,SAAA1H,GAAI,OACpCA,EAAK3B,UAAUI,SAASkG,GAAsB,IAGhDkJ,EAAKxP,UAAUG,OAAO,WAAYiJ,GAElC,IAAME,EAAiBmH,EAAoBlC,GAE3CjP,SAASK,cAAc0O,IAA8BhN,MAAMkI,QACzDD,EAAiB,EAAI,cAAgB,MAnEtB,CAoEnB,GAEAhJ,EAAAA,EAAAA,IAAG,SAAU,uBAAuB,SAAA1B,GAClCA,EAAE2L,gBACJ,KAEAjK,EAAAA,EAAAA,IACE,QAxNgC,4BA0NhC+J,GAAS,SAAAzL,GAAK,UACZgQ,GAAmD,QAAxC,EAAiB,QAAjB,EAAGhQ,EAAEqL,OAAOC,aAAK,OAAe,QAAf,EAAd,EAAgBjH,qBAAa,WAAf,EAAd,EAA+B4F,cAAM,QAAI,GACvDd,KACAvE,EAAW,6BAA8B,CAAE8G,KAAMsE,IACnD,MAGFtO,EAAAA,EAAAA,IACE,SAAQ,iGA9JmB,WAC3B,IACI+Q,EAAOC,EADLpH,EAAQqH,KAAKrH,MAGnB,OAAQqH,KAAKjH,MACX,IAAK,wBACCmE,GAAiBzL,SAASkH,IAC5BsE,GAAgB,GAChBC,GAAmB,KAEnBD,GAAgBW,GAAkBjF,GAClCuE,GAAmB,CAACvE,IAKtB1G,EAFA8N,EAAY,wCAEU,CACpBhH,KAAMkE,GAAc,IAAM,SAE5B,MACF,IAAK,qBACL,IAAK,0BAQH,GAPA6C,EACgB,uBAAdE,KAAKjH,KAAgCoE,GAAcC,GACrD2C,EACgB,uBAAdC,KAAKjH,KACD,sCACA,2CAEFiH,KAAK7G,QACP2G,EAAMG,KAAKtH,OACN,CACL,IAAMuH,EAAQJ,EAAMK,QAAQxH,IACb,IAAXuH,GAAcJ,EAAMM,OAAOF,EAAO,EACxC,CAEAjO,EAAW8N,EAAW,CACpBhH,KAAM+G,EAAM1G,KAAK,QAEnB,MACF,QACE,OAGJrD,KACAS,KAjEczI,SAASK,cACrB,4CAEImK,eAAe,CAAEhE,SAAU,SAAUiE,MAAO,SAgEpD,IAoHA,IAAM6H,GAAqB,WACzB,IAAMpK,EAAY,IAAIC,gBAAgBlH,OAAOsK,SAASC,QAEtD2D,GAAmBjH,EAAUuD,OAAO,YACpCyD,GAAgBC,GAAiBoD,SAAQ,SAAA3H,GAAK,OAAIiF,GAAkBjF,EAAM,IAE1EwE,GAAclH,EAAUuD,OAAO,UAC/B4D,GAAmBnH,EAAUuD,OAAO,eACpC6D,GAAc,GAEd,IAAMkD,EAAqBxS,SAASmC,iBAAiB,kCAI/CsQ,EAAmBzS,SAASmC,iBAAiB,+BAI7CuQ,EAAwB1S,SAASmC,iBAAiB,oCAIxDqQ,EAAmBpQ,SAAQ,SAAAsM,GACzBA,EAAStD,QAAU+D,GAAiBzL,SAASgL,EAAS9D,MACxD,IAEA6H,EAAiBrQ,SAAQ,SAAAsM,GACvBA,EAAStD,QAAUgE,GAAY1L,SAASgL,EAAS9D,MACnD,IAEA8H,EAAsBtQ,SAAQ,SAAAsM,GAC5BA,EAAStD,QAAUiE,GAAiB3L,SAASgL,EAAS9D,MACxD,IAEA2D,IACF,EAEAzO,GAAW,WACTwS,KAEA/C,GAAe3G,MAAMC,KACnB7I,SAASmC,iBAAiB,oCAC1BpD,KAAI,SAAAsD,GAQJ,OAPAA,EAAKwO,WAAa,CAChB5H,MAAO5G,EAAK0G,QAAQE,MACpB0J,KAAMtQ,EAAK0G,QAAQ4J,KACnBhD,WAAYhL,KAAKiL,MAAMvN,EAAK0G,QAAQ4G,YACpCmB,QAASnM,KAAKiL,MAAMvN,EAAK0G,QAAQ+H,SACjCS,aAAc5M,KAAKiL,MAAMvN,EAAK0G,QAAQwI,eAEjClP,CACT,IAEAoG,IACF,KAEAzH,EAAAA,EAAAA,IAAG,QAAS+N,IAA8B,WACxCE,IAAqB3H,KACrBmB,IACF,KAEAzH,EAAAA,EAAAA,IAAG,QAjSD,2CAiSgD,SAAAmD,GAEhD,OADuBA,EAAMwG,OAAO5B,QAA5B6J,YAEN,IAAK,aACH1D,GAAgB,GAChBC,GAAmB,GACnB,MAEF,IAAK,UACHC,GAAc,GACd,MAEF,IAAK,eACHC,GAAmB,GAIvBrH,KACAS,IACF,KAEAzH,EAAAA,EAAAA,IAAG,QAASgO,IAAyB,SAAA1P,GACnCA,EAAE2L,iBAEF,IAEyC,KAF5B3L,EAAEqL,OAAOG,QAAQkE,IAAyBzN,aAAa,QAErCkI,MAAM,KAAI,GAAlCoJ,EAAO,KAAEC,EAAM,KAEtB,GAAID,EAAS,CACX,IAAME,EAAY,IAAI5K,gBAAgB0K,EAAQpJ,MAAM,KAAK,IAAM,IAEzDuJ,EAAS,GAAH,OAAM/R,OAAOsK,SAASkB,SAAQ,YAAIsG,EAAUvK,YAAU,OAChEsK,EAAS,IAAH,OAAOA,GAAW,IAG1B7R,OAAOqH,QAAQ2K,UAAU,KAAM,GAAID,GAEnCV,KACA7J,IACF,CAEA,GAAIqK,EAAQ,CACV,IAAMI,EAAgBlT,SAASK,cAAc,IAAD,OAAKyS,IAC7CI,GACFA,EAAc1I,eAAe,CAAEhE,SAAU,SAAUiE,MAAO,SAE9D,CACF,ICxVA3K,GAAW,WACT,IAAMqT,EAAOnT,SAASmC,iBAAiB,wBACjCiR,EAAcpT,SAASmC,iBAAiB,cAE9CgR,EAAK/Q,SAAQ,SAACiR,EAAKlB,GACjBkB,EAAIlT,iBAAiB,UAAU,WAC7BiT,EAAYhR,SAAQ,SAAAX,GAAO,OAAIA,EAAQf,UAAUC,OAAO,SAAS,IACjEyS,EAAYjB,GAAOzR,UAAUK,IAAI,SACnC,GACF,GACF,KCVAC,EAAAA,EAAAA,IAAG,QAAS,8BAA8B,SAAA1B,GACxCA,EAAE2L,gBACJ,KCFAjK,EAAAA,EAAAA,IAAG,QAAS,8BAA8B,SAAA1B,GACxCA,EAAE2L,iBAEGhK,OAAOqS,SAEZrS,OAAOqS,OAAO,QACdrS,OAAOqS,OAAO,WAAY,iBAC1BrS,OAAOqS,OAAO,UAAW,CACvBC,QAAS,6BACTZ,KAAM,CAAC,4GAEL,oOACAtH,KAAK,QAEX,KAEArK,EAAAA,EAAAA,IAAG,QAAS,+BAA+B,SAAA1B,GACzCA,EAAE2L,iBAEF,IAAMuI,EAAalU,EAAEqL,OAAOC,MAAQtL,EAAEqL,OAAOC,MAAQ,0BAEhD3J,OAAOqS,SAEZrS,OAAOqS,OAAO,QACdrS,OAAOqS,OAAO,WAAY,iBAC1BrS,OAAOqS,OAAO,UAAW,CACvBC,QAAS,oCACTZ,KAAM,CAAC,+BAAD,OAC2Ba,EAAU,2DACzC,qGACAnI,KAAK,QAEX,KAEArK,EAAAA,EAAAA,IAAG,QAAS,wBAAwB,SAAA1B,GAClCA,EAAE2L,iBAEGhK,OAAOqS,SAEZrS,OAAOqS,OAAO,QACdrS,OAAOqS,OAAO,WAAY,iBAC1BrS,OAAOqS,OAAO,UAAW,CACvBC,QAAS,+DAEb,I,eCzCAzT,GAAW,WACTI,YAAW,WACT,IAAIe,OAAOwS,UAAX,CAEA,IAAMC,EAAU1T,SAASK,cAAc,mBAClCqT,IAEAC,GAAAA,EAAQ7O,IAAI,wBACf4O,EAAQhT,UAAUK,IAAI,YAGxBC,EAAAA,EAAAA,IAAG,QAAS,wBAAwB,WAClC2S,GAAAA,EAAQ5O,IAAI,sBAAuB,MAAO,CACxC6O,QAAS,IACTzG,KAAM,MAERuG,EAAQhT,UAAUC,OAAO,WACrBM,OAAO4S,WACT5S,OAAO4S,UAAU3B,KAAK,CAAE/N,MAAO,yBAEnC,IAlB4B,CAmB9B,GAAG,IACL,I,QCzBArE,GAAW,WACT,IAAMgU,EAAgB9T,SAASmC,iBAAiB,wBAC3C2R,GAAkBA,EAAcpN,QAErC,8BAAmBqN,MAAK,aACtBC,EADuC,WACjCF,EAAe,CACnBG,UAAW,UAEf,GACF,ICTO,IAAMC,GAAa5P,GACxB,SAAA6P,GAAG,OACD,IAAInQ,SAAQ,SAACrE,EAASsE,GACpB,IAAMmQ,EAASpU,SAASqU,cAAc,UAEtCD,EAAOlS,aAAa,MAAOiS,GAC3BC,EAAOlS,aAAa,QAAS,SAE7BkS,EAAOE,OAAS3U,EAChByU,EAAOG,QAAUtQ,EAEjBjE,SAAS6C,KAAKiP,YAAYsC,EAC5B,GAAE,ICRAI,GAAuB,SAACzE,EAAS0E,GACrC1E,EAAQ3N,SAAQ,SAAAsS,GACVA,EAAMC,gBAJZT,GAAW,mDAKMH,MAAK,kBAAMU,EAASG,YAAY,GAEjD,GACF,EAEA9U,GAAW,WACT,IAAM+U,EAAU7U,SAASmC,iBAAiB,qBAC1C,GAAsB,GAAlB0S,EAAQnO,OAAZ,CAEA,IAKM+N,EAAW,IAAIK,qBAAqBN,GAL1B,CACdO,KAAM,KACNC,WAAY,MACZC,UAAW,KAGbJ,EAAQzS,SAAQ,SAAAuI,GACd8J,EAASS,QAAQvK,EACnB,GAV+B,CAWjC,I,yBCxBIwK,GAAqB,CAAC,EACtBC,GAAoB,CAAC,EACrBC,GAAmB,CAAC,EACpBC,GAAc,CAAC,EACfC,GAAkB,CAAC,EACnBC,GAAqB,CAAC,EAEpBC,GAAgB,KAkBhBC,GAAuB,SAACC,EAAaxD,GACzC,IAAMyD,EAAY5V,SAASK,cAAc,sCAAD,OACAsV,EAAW,OAEnD,GAAKC,EAAL,CAEA,IAAMjN,EAAQiN,EAAUzT,iBACtB,4CAEI0T,EAASD,EAAUzT,iBAAiB,6BAE1CwG,EAAMvG,SAAQ,SAACC,EAAMyT,GACnBzT,EAAKH,aAAa,gBAAiB4T,GAAa3D,EAAQ,OAAS,QACnE,IAEA0D,EAAOzT,SAAQ,SAAC2T,EAAOC,GACrBD,EAAMrV,UAAUG,OAAO,SAAUmV,GAAc7D,EACjD,IAEA,IACM1Q,EADakH,EAAMwJ,GACEzQ,mBACrBuU,EAAqBxU,EAAQpB,cACjC,2CAEI6V,EAAiB,GAAH,OAAMP,EAAW,YAAIxD,GACnCxQ,EAAgBF,EAAQG,aACxBC,GAAmC,KAAhBF,GAAsBG,QAAQ,GAEvDL,EAAQM,MAAMC,WAAa,cAAH,OAAiBH,EAAe,gCAAwBA,EAAe,eAC/FJ,EAAQM,MAAME,UAAY,GAAH,OAAMN,EAAa,MA7ClB,SAACsU,EAAoBC,GACzCX,GAAgBW,GAClBX,GAAgBW,GAAgBnR,IAAI,GAEpCwQ,GAAgBW,GAAkB,IAAIC,KAAAA,MAAiBF,EAAoB,CACzEG,YAAa,EACbC,OAAQ,SACRC,SAAUb,GACVc,WAAY,EACZC,SAAU,CAAEC,MAAO,OAAQC,OAAQ,UAIvCnB,GAAgBW,GAAgBS,QAAQ,EAC1C,CAiCEC,CAAkBX,EAAoBC,GA2CxC,SAA4BP,EAAakB,GAClCxB,GAAiBM,KACpBL,GAAYK,GAAezP,aAAY,WACrC4Q,GAAoBnB,EAAakB,EACnC,GAAGpB,IACHJ,GAAiBM,IAAe,EAEpC,CAjDEoB,CAAmBpB,EAAahN,EAAMjC,OA5BhB,CA6BxB,EASMsQ,GAA0B,WAC9B,IACMC,EADWhW,OAAOsK,SAAS2L,KAAKC,UAAU,GACrB1N,MAAM,KAE3B2N,EAAUH,EAAU,GACpBI,EAAaC,SAASL,EAAU,GAAI,IAEpCrU,EAAU5C,SAASuX,eAAeH,GACjC,OAAPxU,QAAO,IAAPA,GAAAA,EAAS4H,eAAe,CACtBhE,SAAU,WAGR4Q,GAAWC,IACbjC,GAAkBgC,GAAWC,EAC7BG,GAAmBJ,GACnB1B,GAAqB0B,EAASC,GAElC,EAEA,SAASP,GAAoBnB,EAAakB,GAIxC,GAHkB7W,SAASK,cAAc,sCAAD,OACAsV,EAAW,OAEnD,CAEA,IACM8B,IADerC,GAAkBO,IAAgB,GACrB,GAAKkB,EAEvCzB,GAAkBO,GAAe8B,EACjC/B,GAAqBC,EAAa8B,EANZ,CAOxB,CAWA,SAASD,GAAmB7B,GACtBN,GAAiBM,KACnBvP,cAAckP,GAAYK,IAC1BN,GAAiBM,IAAe,EAEpC,CAEA,SAAS+B,GAAmB/B,EAAaO,GACnCb,GAAiBM,KACnBvP,cAAckP,GAAYK,IAC1BJ,GAAgBW,GAAgByB,QAChCnC,GAAmBU,GAAkBX,GAAgBW,GAAgBtL,QACrEyK,GAAiBM,IAAe,EAEpC,CAEA,SAASiC,GAAoBjC,EAAaO,EAAgBW,GACxD,IAAKxB,GAAiBM,GAAc,CAClC,IACMkC,GAAiB,EADArC,GAAmBU,IACKT,GAE/CF,GAAgBW,GAAgB4B,SAEhC,IAAMC,EAAU7X,YAAW,WACzB4W,GAAoBnB,EAAakB,GAEjCvB,GAAYK,GAAezP,aAAY,WACrC4Q,GAAoBnB,EAAakB,EACnC,GAAGpB,GACL,GAAGoC,GAEHvC,GAAYK,GAAeoC,EAC3B1C,GAAiBM,IAAe,CAClC,CACF,CAEA,SAASqC,GAA+BrC,EAAasC,GACnD,IAAMrC,EAAY5V,SAASK,cAAc,sCAAD,OACAsV,EAAW,OAEnD,GAAKC,EAAL,CAEA,IAAMsC,EAeR,SAA6BvM,GAA4B,IAAxBwM,EAAmB,UAAH,6CAAG,GAC5CC,EAAOzM,EAAG0M,wBACVC,EACJrX,OAAOsX,aAAevY,SAASwY,gBAAgB5S,aAEjD,OACEwS,EAAK7R,KAAO,EAAI4R,GAAoBC,EAAK1B,QAAU,GACnD0B,EAAK7R,IAAM4R,EAAmBC,EAAK1B,QAAU4B,CAEjD,CAxB6BG,CAAoB7C,GACzC8C,EAAetD,GAAkBO,IAAgB,EACjDO,EAAiB,GAAH,OAAMP,EAAW,YAAI+C,GAErCR,EACG7C,GAAiBM,IACpBiC,GAAoBjC,EAAaO,EAAgB+B,GAG/C5C,GAAiBM,IACnB+B,GAAmB/B,EAAaO,EAZd,CAexB,C,ghCAaAjV,OAAOd,iBAAiB,QAAQ,WAC9B,IAAMwY,EAAa3Y,SAASmC,iBAAiB,mBAE7CwW,EAAWvW,SAAQ,SAAAwT,GACjB,IAAQD,EAAgBC,EAAU7M,QAA1B4M,YACFhN,EAAQiN,EAAUzT,iBACtB,4CAEIyW,EAAehD,EAAUzT,iBAC7B,kEAEI8V,EAAcW,EAAalS,OAEjC,SAASvF,EAAgB,GAA2B,IAAVC,EAAM,EAArBC,cAGzB,KAF4D,SAAzCD,EAAOG,aAAa,kBAEvC,CAIA,IAAMsX,EAAcjQ,MAAMC,KAAKF,GAAOyJ,QAAQhR,GAE9CgU,GAAkBO,GAAekD,EAEjCrB,GAAmB7B,GACnBD,GAAqBC,EAAakD,EAPlC,CAQF,CAEA,SAASC,IACP,IAAMhD,EAAYlN,MAAMC,KAAK+P,GAAcxG,QAAQH,MAC7CiE,EAAiB,GAAH,OAAMP,EAAW,YAAIG,GACzC4B,GAAmB/B,EAAaO,EAClC,CAEA,SAAS6C,IACP,IAAMjD,EAAYlN,MAAMC,KAAK+P,GAAcxG,QAAQH,MAC7CiE,EAAiB,GAAH,OAAMP,EAAW,YAAIG,GACzC8B,GAAoBjC,EAAaO,EAAgB+B,EACnD,CAQA,GANAtP,EAAMvG,SAAQ,SAAAC,GAAI,OAAIA,EAAKlC,iBAAiB,QAASgB,EAAgB,IACrEyX,EAAaxW,SAAQ,SAAA4W,GACnBA,EAAU7Y,iBAAiB,aAAc2Y,GACzCE,EAAU7Y,iBAAiB,aAAc4Y,EAC3C,IAEIpQ,EAAMjC,OAAS,EAAG,CACpB,IAAMuS,EAAoB9D,GAAmBQ,IAAgB,GAnK3C,SAACA,EAAasD,GACpC9D,GAAmBQ,GAAesD,EAClC7D,GAAkBO,GAAesD,EAEjCvD,GAAqBC,EAAasD,EACpC,CA+JMC,CAAgBvD,EAAasD,GAC7BvB,GAAmB/B,EAAa,GAAF,OAAKA,EAAW,YAAIsD,GACpD,CAEAhY,OAAOd,iBAAiB,UAAU,kBAChC6X,GAA+BrC,EAAasC,EAAY,GAE5D,IAEIU,EAAWjS,OAAS,IACtBxG,WAAW8W,GAAyB,MACpChW,EAAAA,EAAAA,IAAG,QAAS,6BAA6B,WACvCd,WAAW8W,GAAyB,IACtC,IAEJ,IC/OAlX,GAAW,WACT,IAAMqZ,EAAenZ,SAASmC,iBAAiB,oBAE1CgX,GAILA,EAAa/W,SAAQ,SAAAgX,GAGnB,GAFuBA,EAAYtO,QAAQ,qBAErB7J,OAAOsG,WAAW,uBAAuBC,QAAS,CACtE,IAAM6R,EAAQD,EAAYjX,iBAAiB,iBACrCmX,EAAaD,EAAM3S,OACrBgS,EAAe,EAQba,EAAU,SAAApH,GACVkH,EAAMlH,IACRkH,EAAMlH,GAAOzR,UAAUK,IAAI,uBAE/B,EAaA,OAXAwY,EAAQb,QAERxS,aAAY,YACVwS,GAAgB,IACIY,IAClBZ,EAAe,GAhBjBW,EAAMjX,SAAQ,SAAAoX,GACZA,EAAI9Y,UAAUC,OAAO,uBACvB,IAiBA4Y,EAAQb,EACV,GAAG,IAGL,CAEA,IAAMe,EAAcL,EAAYjX,iBAAiB,0BAC3CuX,EAAaN,EAAYO,YAE3BC,EADqBhR,MAAMC,KAAK4Q,GACFI,QAChC,SAACC,EAAKzX,GAAI,OAAKyX,EAAMzX,EAAKsX,WAAW,GACrC,GAEEI,EAAaH,EAIjB,GAFAR,EAAYrX,MAAMiY,YAAY,eAAgB,GAAF,OAAKJ,EAAU,OAEvDA,EAAaF,EACf,KAAOE,EAAaF,GAClBD,EAAYrX,SAAQ,SAAAC,GAClB,IAAM4X,EAAa5X,EAAK6X,WAAU,GAClCd,EAAYtH,YAAYmI,GACxBL,GAAcvX,EAAKsX,WACrB,IAMJ,IAFA,IAAIQ,EAAc,EAEXA,EAAcT,GACnBD,EAAYrX,SAAQ,SAAAC,GAClB,IAAM4X,EAAa5X,EAAK6X,WAAU,GAClCd,EAAYtH,YAAYmI,GACxBE,GAAe9X,EAAKsX,WACtB,IAGF,IAAM3T,EAAYoT,EAAYrQ,QAAQ/C,WAAa,QAE/CoU,EAAoBL,EAAa,GAEjC9Y,OAAOsG,WAAW,sBAAsBC,QAE1C4S,GADoBhB,EAAYrQ,QAAQsR,aAAe,EAIvDD,GADchB,EAAYrQ,QAAQuR,OAAS,EAI3B,UAAdtU,EACFoT,EAAYrX,MAAMwY,UAAY,SAAH,OAAYH,EAAiB,qBACjC,SAAdpU,IACToT,EAAYrX,MAAMwY,UAAY,cAAH,OAAiBH,EAAiB,uBAG/DpZ,EAAAA,EAAAA,IAAG,YAAa,2BAA2B,SAAUmD,GACnDA,EAAM9C,cAAcU,MAAMyY,mBAAqB,QACjD,KAEAxZ,EAAAA,EAAAA,IAAG,WAAY,2BAA2B,SAAUmD,GAClDA,EAAM9C,cAAcU,MAAMyY,mBAAqB,SACjD,GACF,GACF,ICnGA,IAAMC,GAAkB,CAAC,aAAc,YAAa,QAAS,mBACvDC,GAAuB,CAC3B,0BACA,2BACA,0BACA,wBAEIC,GAAoB,qBAoB1B3Z,EAAAA,EAAAA,IAAG,SAAU,mCAAmC,SAAA1B,GAC9CA,EAAE2L,iBACF,IAAM2P,EAAOtb,EAAE+B,cACTwZ,EAAe7a,SAASuX,eAAe,gCAC7CsD,EAAana,UAAUC,OAAO,UAAW,UACzCka,EAAa1Q,YAAc,SAE3B,IAAI2Q,GAAY,EAchB,GAZAL,GAAgBrY,SAAQ,SAAA2Y,GACtB,IAAMC,EAAQhb,SAASuX,eAAewD,GAClCC,IACFA,EAAMta,UAAUC,OAAOga,IAElBK,EAAMpQ,OAAUoQ,EAAMpQ,MAAMlE,SAC/BoU,GAAY,EACZE,EAAMta,UAAUK,IAAI4Z,KAG1B,KAEIG,EAAJ,CAIA,IAAMG,EAAcR,GAAgBZ,QAAO,SAACC,EAAKiB,GAC/C,IAAMC,EAAQhb,SAASuX,eAAewD,GACtC,OAAIC,EACK,GAAP,MACKlB,GAAG,SACLiB,EAAQC,EAAMpQ,QAIZkP,CACT,GAAG,CAAC,GAEEoB,EAASR,GAAqBb,QAAO,SAACC,EAAKiB,GAC/C,IAAMrM,EAAW1O,SAASuX,eAAewD,GACzC,OAAIrM,GAAYA,EAAStD,QAChB,GAAP,MACK0O,GAAG,SACLiB,EAAQrM,EAAStD,UAIf0O,CACT,GAAGmB,GAEHJ,EAAa3Y,aAAa,WAAY,YAEtCiZ,MAAMP,EAAKQ,OAAQ,CACjB3X,OAAQ,OACRG,QAAS,CACP,eAAgB,oBAElBxD,KAAMuE,KAAKC,UAAUsW,KAEpBnH,MAAK,WACJ8G,EAAana,UAAUK,IAAI,WAC3B8Z,EAAa5J,UAAY,GAAH,OA9ER,mjBA8EyB,WACzC,IAAE,OACK,WACL4J,EAAana,UAAUK,IAAI,UAC3B8Z,EAAa5J,UAAY,GAAH,OAtEV,+wCAsEyB,yBACvC,IAAE,SACO,WACP4J,EAAaQ,gBAAgB,YAC7BT,EAAKU,QACLpb,YAAW,WACT2a,EAAaQ,gBAAgB,YAC7BR,EAAana,UAAUC,OAAO,UAAW,UACzCka,EAAa1Q,YAAc,QAC7B,GAAG,IACL,GAnDF,CAoDF,KCtGAnJ,EAAAA,EAAAA,IAAG,QAAS,8BAA8B,SAAA1B,GAAK,QAE5B,QAAjB,EADeA,EAAE+B,cACVka,kBAAU,OAAW,QAAX,EAAjB,EAAmB7a,iBAAS,OAA5B,EAA8BG,OAAO,+BACvC,ICFA,IACM2a,GAAiB,qBACjBC,GAAwB,qBACxBC,GAAW,+BAEXC,GAAgB,WACpB,OAAI1a,OAAOsG,WAAW,sBAAsBC,QACnC,EACEvG,OAAOsG,WAAW,sBAAsBC,QAC1C,EAEF,CACT,EAEMoU,GAAa,WAAH,OAAS5b,SAASK,cAAc,wBAAwB,EAElEwb,GAAoB,WAAH,OACrBjT,MAAMC,KAAK7I,SAASmC,iBAAiB,qCAAqC,E,owBAE5ErC,GAAW,WAC6C,QAAlD+b,KAAoBnV,OAASiV,KAAkB,IACrC,QAAZ,EAAAC,YAAY,OAAW,QAAX,EAAZ,EAAclb,iBAAS,OAAvB,EAAyBC,OAAO+a,KAGlCG,KAAoBzZ,SAAQ,SAACC,EAAM8I,GAC7BA,EAAIwQ,MACNtZ,EAAK3B,UAAUK,IAAI0a,GAEvB,GACF,KAEAza,EAAAA,EAAAA,IAAG,SAAU,gCAAgC,SAAA1B,GAC3C,IACQ6J,EADM7J,EAAEqL,OACM5B,QAAdI,IACR,GAAKA,EAAL,CAIA,IAAM2S,EAAc,GAEpBD,KAAoBzZ,SAAQ,SAACC,EAAM8I,GAWjC,IAQgD,IAGvC,IAlBkB,IA5CV,QAyCIhC,EAUJ9G,EAAK0G,QAAdgT,KACoBtS,MAAM,KAEf/F,SAASyF,IAC1B9G,EAAK3B,UAAUC,OAAO6a,GAAgBC,IAEtCK,EAAY5J,KAAK7P,GAEbyZ,EAAYpV,OAASiV,KAAkB,GACzCtZ,EAAK3B,UAAUK,IAAI0a,IACP,QAAZ,EAAAG,YAAY,OAAW,QAAX,EAAZ,EAAclb,iBAAS,OAAvB,EAAyBC,OAAO+a,KAEpB,QAAZ,EAAAE,YAAY,OAAW,QAAX,EAAZ,EAAclb,iBAAS,OAAvB,EAAyBK,IAAI2a,MAG/BrZ,EAAK3B,UAAUK,IAAIya,IACnBnZ,EAAK3B,UAAUC,OAAO8a,MAzBtBpZ,EAAK3B,UAAUC,OAAO8a,GAAuBD,IAEzCrQ,EAAIwQ,OACNtZ,EAAK3B,UAAUK,IAAI0a,IACP,QAAZ,EAAAG,YAAY,OAAW,QAAX,EAAZ,EAAclb,iBAAS,OAAvB,EAAyBC,OAAO+a,KAuBtC,GAjCA,CAkCF,KAEA1a,EAAAA,EAAAA,IAAG,QAAS,yBAAyB,WACnC6a,KAAoBzZ,SAAQ,SAAAC,GAC1BA,EAAK3B,UAAUC,OAAO8a,GACxB,IAEAxJ,KAAKvR,UAAUK,IAAI2a,GACrB,IC/EA5b,GAAW,WACT,IAAMqF,EAAkBnF,SAASK,cAAc,0BAC1C8E,GAEL,8BAAiB4O,MAAK,YAAqC,IAAzBiI,EAAM,UAAEC,EAAU,EAAVA,WACxCD,EAAOzY,IAAI,CAAC0Y,IAEZ,IAAID,EAAO7W,EAAiB,CAC1B+W,aAAc,GACdC,cAAe,IACfC,cAAe,UACf7b,WAAY,CACV8b,OAAQ,uCACRC,OAAQ,wCAEVC,YAAa,CACX,IAAK,CACHJ,cAAe,GAEjB,IAAK,CACHA,cAAe,KAEjB,KAAM,CACJA,cAAe,OAIvB,GACF,IC1BA,IAKIK,GALEC,GAA4B,oCAE5BC,GAAe,WAAH,OAChB1c,SAASK,cAAc,+BAA+B,EAIlDwb,GAAoB,WAAH,OACrBjT,MAAMC,KAAK7I,SAASmC,iBAAiB,qCAAqC,EAEtEwa,GAAe,GAEfC,GAAyB,GAwB/B,SAASC,KACP,IAAMC,EAAsB9c,SAASK,cAAc,0BACnD,GAAKyc,EAAL,CAEA,GAbI7b,OAAOsG,WAAW,sBAAsBC,QACnCqU,KAAoBnV,OAAS,EAElCzF,OAAOsG,WAAW,uBAAuBC,QACpCqU,KAAoBnV,OAAS,EAE/BmV,KAAoBnV,OAAS,GAclC,OANAoW,EAAoBpc,UAAUK,IAAI0b,SAC9BD,KACFA,GAAeO,UACfP,GAAiB,OAMrB,IAAMrX,EAAkBnF,SAASK,cAC/B,kCAEG8E,GAEL,8BAAiB4O,MAAK,YAA2C,IAA/BiI,EAAM,UAAEC,EAAU,EAAVA,WAAYe,EAAI,EAAJA,KACpDhB,EAAOzY,IAAI,CAAC0Y,EAAYe,IAExBR,GAAiB,IAAIR,EAAO7W,EAAiB,CAC3CgX,cAAe,KACfc,KAAM,CACJC,KAAM,GAER3c,WAAY,CACV8b,OAAQ,uCACRC,OAAQ,wCAEVC,YAAa,CACX,IAAK,CACHJ,cAAe,KAEjB,KAAM,CACJA,cAAe,EACfc,KAAM,CACJC,KAAM,OAMdJ,EAAoBpc,UAAUC,OAAO8b,GACvC,GA3CgC,CA4ClC,CAEA3c,GAAW,WAtEX,IACQqd,IAAiBtB,KACvBe,GAAuB1K,KAAI,MAA3B0K,GAAsB,GAASO,IAsE/BN,KACA5b,OAAOd,iBAAiB,SAAU0c,GACpC,KAEA7b,EAAAA,EAAAA,IAAG,SAAU,kCAAkC,SAAA1B,GAC7C,IAvEM8d,EAwEEjU,EADM7J,EAAEqL,OACM5B,QAAdI,IACHA,IAELjF,EAAW,2CAA4C,CAAE8G,KAAM7B,IA3EzDiU,EAAWV,KACjBE,GAAuBxa,SAAQ,SAAAC,GAC7B+a,EAAStL,YAAYzP,EACvB,IA4EAwZ,KAAoBzZ,SAAQ,SAAAC,GACZ,QAAR8G,GAAiB9G,EAAK0G,QAAQI,MAAQA,IAC1CwT,GAAazK,KAAK7P,GAClBA,EAAK1B,SAET,IAEAkc,KACF,IC7GA,IAGIL,GAHEC,GAA4B,uCAC5BY,GAAyB,yCAIzBC,GAAkB,WAAH,OACnB1U,MAAMC,KACJ7I,SAASmC,iBACP,qDAEH,EAYH,SAASob,KACP,IAAMpY,EAAkBnF,SAASK,cAC/B,qCAEImd,EAAsBxd,SAASK,cACnC,6BAEF,GAAK8E,EAEL,OAlBIlE,OAAOsG,WAAW,sBAAsBC,QACnC8V,KAAkB5W,OAAS,EAEhCzF,OAAOsG,WAAW,uBAAuBC,QACpC8V,KAAkB5W,OAAS,EAE7B4W,KAAkB5W,OAAS,IAahC8W,EAAoB9c,UAAUK,IAAI0b,SAC9BD,KACFA,GAAeO,UACfP,GAAiB,aAMrB,8BAAiBzI,MAAK,YAA2C,IAA/BiI,EAAM,UAAEC,EAAU,EAAVA,WAAYe,EAAI,EAAJA,KACpDhB,EAAOzY,IAAI,CAAC0Y,EAAYe,IAExB,IAAMS,EAAgBD,EAAoB9c,UAAUI,SAClDuc,IA0BFb,GAAiB,IAAIR,EAAO7W,EAvBP,CACnBgX,cAAe,KACf5b,WAAY,CACV8b,OAAQ,0CACRC,OAAQ,2CAEVW,KAAM,CACJS,KAAMD,EAAgB,MAAQ,SAC9BP,KAAMO,EAAgB,EAAI,GAE5BlB,YAAa,CACX,IAAK,CACHJ,cAAe,IACfc,KAAM,CACJC,KAAM,IAGV,KAAM,CACJf,cAAe,MAOrBqB,EAAoB9c,UAAUC,OAAO8b,GACvC,GACF,CAEA3c,GAAW,WACTyd,KACAtc,OAAOd,iBAAiB,SAAUod,GACpC,IChFAzd,GAAW,WACT,IAAMqF,EAAkBnF,SAASK,cAAc,0BAC1C8E,GAEL,8BAAiB4O,MAAK,YAAqC,IAAzBiI,EAAM,UAAEC,EAAU,EAAVA,WACxCD,EAAOzY,IAAI,CAAC0Y,IAEZ,IAAID,EAAO7W,EAAiB,CAC1B+W,aAAc,GACdC,cAAe,EACfC,cAAe,UACf7b,WAAY,CACV8b,OAAQ,+BACRC,OAAQ,gCAEVC,YAAa,CACX,IAAK,CACHJ,cAAe,QAEjB,KAAM,CACJA,cAAe,KAIvB,GACF,ICzBArc,GAAW,WAGT,GAF6BmB,OAAOsG,WAAW,uBAEtBC,QAAS,CAChC,IAAMrC,EAAkBnF,SAASK,cAAc,2BAC/C,IAAK8E,EAAiB,OAEtB,8BAAiB4O,MAAK,YAAiD,IAArCiI,EAAM,UAAEC,EAAU,EAAVA,WAAY0B,EAAU,EAAVA,WACpD3B,EAAOzY,IAAI,CAAC0Y,EAAY0B,IAExB,IAAI3B,EAAO7W,EAAiB,CAC1B+W,aAAc,GACdC,cAAe,EACfC,cAAe,UACfwB,WAAY,CACVC,YAAa,2BACblS,GAAI,8BACJmS,WAAW,IAGjB,GACF,CACF,I,ICrBMC,G,QAAcC,GAAYzT,QAI9BwT,GAAYE,OAAQ,EACpBhd,OAAOid,SAAWH,GAGpBA,GAAYI,YAAc,SAACpa,EAAOqa,EAASC,GACzCC,EAAAA,EAAkB,eAAgB,CAAEF,QAAAA,EAASC,OAAAA,IAC7CC,EAAAA,GAAwBva,EAC1B,E,eCTMwa,GAAUC,EAAAA,MAChBT,GAAYU,MAAKC,EAAAA,GAAAA,IAAuBH,KCJxC,IAMMI,GAAe,SAAH,GAA2B,IAArB/I,EAAS,EAATA,UAAWvC,EAAG,EAAHA,IAC3BF,EAAOyC,EAAUzT,iBAAiB,kCAClCyc,EAAahJ,EAAUzT,iBAAiB,4BAA4B,GAC1EgR,EAAK/Q,SAAQ,SAAAiR,GAAG,OAAIA,EAAI3S,UAAUC,OAAO,SAAS,IAClD0S,EAAI3S,UAAUK,IAAI,UAClB6d,EAAW1c,aAAa,eAAgBmR,EAAI9R,aAAa,YAC3D,ECyBAsd,EAAAA,EAAMtU,SAaNvJ,EAAAA,EAAAA,IAAG,QAAS,qBAAqB,YAAuB,QAC9B,QAAxB,EAD+C,EAAbK,cACpBka,kBAAU,OAAW,QAAX,EAAxB,EAA0B7a,iBAAS,OAAnC,EAAqCG,OAAO,YAC9C,IAEAf,GAAW,WACT8I,MAAMC,KAAK7I,SAASmC,iBAAiB,+BAA+BC,SAClE,SAAAwT,GAAS,ODxDc,SAAAA,IACzB5U,EAAAA,EAAAA,IAAG,QAAS,kCAAkC,SAAAmD,GAC5Cwa,GAAa,CAAE/I,UAAAA,EAAWvC,IAAKlP,EAAM9C,eACvC,GACF,CCoDiByd,CAAmBlJ,EAAU,IAG5C3Q,IAAc8O,MAAK,SAAAgL,GACjB,GAAKA,EAAL,CAIA,IAAQC,EAASD,EAATC,KACR,GAAKA,IAKL/d,OAAO4S,UAAY5S,OAAO4S,WAAa,GACvC5S,OAAO4S,UAAU3B,KAAK,CAAE+M,OAAQD,EAAK9f,KAEjC+B,OAAOie,IACTje,OAAOie,GAAG,WAAY,KAAM,CAC1BC,QAASH,EAAK9f,GACdkgB,WAAYJ,EAAKK,sBAIjBpe,OAAOqS,SACTrS,OAAOqS,OAAO,WAAY,CACxBgM,MAAON,EAAKM,QAGdre,OAAOqS,OAAO,UAAW,CACvBgM,MAAON,EAAKM,SAIZre,OAAOse,UACTte,OAAOse,QAAQ,MAAO,UAAWP,EAAK9f,IACtC+B,OAAOse,QAAQ,MAAO,aAAcP,EAAKK,sBAGvCL,EAAKM,OAAO,CACd,IAAME,EAAexf,SAASK,cAAc,6BACxCmf,IACFA,EAAaC,KAAO,qDAAH,OAAwDC,mBACvEV,EAAKM,QAGX,CAxCA,CAyCF,GACF,G,4gDC1G+C,I,MAAA,e,sRAAA,U,MAAA,2B,4FAAA,iCA2B5C,O,EA3B4C,G,EAAA,sBAK7C,WAAU,WACFK,EAAgB1N,KAAK2N,aACtBD,GAEL,8BAAiB5L,MAAK,YAAqC,IAAzBiI,EAAM,UAAEC,EAAU,EAAVA,WACxCD,EAAOzY,IAAI0Y,GAEX,IAAID,EAAO2D,EAAe,CACxBzD,aAAc,GACdC,cAAe,EACfC,cAAe,UACf7b,WAAY,CACV8b,OAAQ,EAAKwD,WACbvD,OAAQ,EAAKwD,YAEfvD,YAAa,CACX,IAAK,CACHJ,cAAe,OAIvB,GACF,M,8EAAC,EA3B4C,C,QAElB4D,I,EAAU,E,EACpB,CAAC,SAAU,OAAQ,S,MADC,c,kmDCFQ,I,MAAA,e,sRAAA,U,MAAA,2B,4FAAA,iCA+B5C,O,EA/B4C,G,EAAA,kCAK7C,SAAoB5b,GAClB,IAAM8E,EAAQ9E,EAAM9C,cACdI,EAAUwH,EAAMvH,mBAGhBse,EAAwB,cAFhB/W,EAAMF,QAAQkX,YAGtBze,EAAWwe,EAAc,WAAa,YAEtCre,EAAgBF,EAAQG,aACxBC,GAAmC,KAAhBF,GAAsBG,QAAQ,GAEvDmH,EAAMvI,UAAUG,OAAO,YAEvBY,EAAQM,MAAMC,WAAa,cAAH,OAAiBH,EAAe,gCAAwBA,EAAe,eAC/FJ,EAAQM,MAAME,UAAY+d,EAAc,GAAH,OAAMre,EAAa,MAAO,KAE/DsH,EAAMF,QAAQkX,YAAcze,CAC9B,GAAC,gCAED,WACEyQ,KAAKiO,oBAAoBxf,UAAUG,OAAO,UAC1CoR,KAAKkO,mBAAmBzf,UAAUG,OAAO,UAEzC,IACMc,EADSsQ,KAAKkO,mBAAmB9a,cACVzD,aAC7BqQ,KAAKkO,mBAAmB9a,cAActD,MAAME,UAAY,GAAH,OAAMN,EAAa,KAC1E,M,8EAAC,EA/B4C,C,QAElBoe,I,EAAU,E,EACpB,CAAC,eAAgB,gBAAiB,kB,MADd,c,mmDCFQ,I,MAAA,e,sRAAA,U,MAAA,2B,4FAAA,iCAO5C,O,EAP4C,G,EAAA,oBAK7C,WACE9N,KAAKmO,aAAajW,YAAc,UAAH,OAAa8H,KAAKoO,WAAWzV,MAAK,IACjE,M,8EAAC,EAP4C,C,QAElBmV,I,EAAU,E,EACpB,CAAC,OAAQ,W,MADW,c,mmDCFQ,I,MAAA,e,sRAAA,U,MAAA,2B,4FAAA,iCAuE5C,O,EAvE4C,G,EAAA,sBAK7C,WACE9N,KAAKqO,UAAY,EACjBrO,KAAKsO,SAAW,IAChBtO,KAAKuO,sBAAuB,EAC5BvO,KAAKwO,aAAc,EACnBxO,KAAKyO,YAAYC,MAAO,EACxB1O,KAAKyO,YAAYvgB,iBAAiB,QAAS8R,KAAK2O,iBAAiBC,KAAK5O,OACtEA,KAAKyO,YAAYvgB,iBAAiB,OAAQ8R,KAAK6O,WAAWD,KAAK5O,OAC/DA,KAAKyO,YAAYvgB,iBAAiB,QAAS8R,KAAK8O,YAAYF,KAAK5O,OACjEA,KAAKyO,YAAYvgB,iBACf,aACA8R,KAAK+O,iBAAiBH,KAAK5O,OAE7BA,KAAKgP,6BACP,GAAC,8BAED,WACEhP,KAAKqO,YACDrO,KAAKqO,UAAYY,KAAKC,MAAMlP,KAAKsO,UACnCtO,KAAKyO,YAAYU,OACPnP,KAAKuO,uBACfvO,KAAKyO,YAAYW,YAAc,EAC/BpP,KAAKyO,YAAYU,OAErB,GAAC,8BAED,WACE,IAAME,EAAiBrP,KAAKsO,SAAWW,KAAKC,MAAMlP,KAAKsO,UACjDgB,EAAqBtP,KAAKyO,YAAYpK,SAAWgL,EAErDrP,KAAKqO,YAAcY,KAAKC,MAAMlP,KAAKsO,WACnCtO,KAAKyO,YAAYW,aAAeE,IAEhCtP,KAAKyO,YAAY/I,QACjB1F,KAAKuO,sBAAuB,EAEhC,GAAC,wBAED,WACEvO,KAAKwO,aAAc,EACdxO,KAAKyO,YAAYc,OAGpBvP,KAAKyO,YAAYU,OAFjBnP,KAAKyO,YAAY/I,OAIrB,GAAC,wBAED,WACM1F,KAAKuO,sBAAwBvO,KAAKwO,cACpCxO,KAAKuO,sBAAuB,EAC5BvO,KAAKqO,UAAY,GAEnBrO,KAAKwO,aAAc,EACnBxO,KAAKgP,6BACP,GAAC,yBAED,WACEhP,KAAKgP,6BACP,GAAC,yCAED,WACMhP,KAAKyO,YAAYc,OACnBvP,KAAKwP,kBAAkB1f,MAAMkI,QAAU,OAEvCgI,KAAKwP,kBAAkB1f,MAAMkI,QAAU,MAE3C,M,8EAAC,EAvE4C,C,QAElB8V,I,EAAU,E,EACpB,CAAC,QAAS,gB,MADU,c,mmDCFQ,I,MAAA,e,sRAAA,U,MAAA,2B,4FAAA,iCAmC5C,O,EAnC4C,G,EAAA,sBAK7C,WAAU,WACFJ,EAAgB1N,KAAK2N,aAC3B,GAAKD,EAAL,CAEA,IAAM+B,EAAgBzP,KAAK0P,eAAiB1P,KAAK2P,cAEjD,8BAAiB7N,MAAK,YAAiD,IAArCiI,EAAM,UAAEC,EAAU,EAAVA,WAAY0B,EAAU,EAAVA,WACpD3B,EAAOzY,IAAI,CAACoa,EAAY1B,IAExB,IAAID,EAAO2D,EAAe,CACxBzD,aAAc,GACdC,cAAe,EACfyB,WAAY,CACVC,YAAa,2BACblS,GAAI,EAAKkW,iBACT/D,WAAW,GAEbvd,aAAYmhB,GACR,CACErF,OAAQ,EAAKwD,WACbvD,OAAQ,EAAKwD,YAGnBvD,YAAa,CACX,KAAM,CACJJ,cAAe,KAIvB,GA3B0B,CA4B5B,M,8EAAC,EAnC4C,C,QAElB4D,I,EAAU,E,EACpB,CAAC,SAAU,aAAc,OAAQ,S,MADb,c,s1FCFQ,4LAmC5C,OAnC4C,4CAM7C,WAAU,WACR9N,KAAKrP,QAAQzC,iBAAiB,UAAU,SAAAgE,GACtCA,EAAM8G,iBAEN,EAAK6W,WACP,GACF,GAAC,uBAED,SAAAA,YACE,IAAMC,kBAAoB9P,KAAK+P,eAAejY,OAC5C,SAAAkY,GAAO,MAA6B,KAAzBA,EAAQrX,MAAMrB,MAAa,IAGxC,GAAKwY,kBAAL,CAIA,IAAIG,QAAUjQ,KAAKkQ,aACnBlQ,KAAK+P,eAAe5f,SAAQ,SAAA6f,GAC1B,IAAMrX,EAAQwX,WAAWH,EAAQrX,QAAU,EAC3CsX,QAAUA,QAAQG,QAAQ,IAAIC,OAAOL,EAAQlZ,QAAQiC,KAAM,KAAMJ,EACnE,IAEA,IACE,IAAM/F,OAAS0d,KAAKL,SACpBjQ,KAAKuQ,aAAaC,UAAY5d,OAAO/C,QAAQ,EAC/C,CAAE,MAAOxC,GACP2S,KAAKuQ,aAAaC,UAAY,OAChC,CAbA,CAcF,KAAC,SAnC4C,CAElB1C,gDAAAA,IAAU,mCACpB,CAAC,UAAW,WAAS,kCACtB,CAAEmC,QAASQ,Q,4gDCJkB,I,MAAA,e,sRAAA,U,MAAA,2B,4FAAA,iCA0B5C,O,EA1B4C,G,EAAA,sBAK7C,WAAU,WACF/C,EAAgB1N,KAAK2N,aACtBD,GAED1e,OAAO0hB,WAAa,MACtB,8BAAiB5O,MAAK,YAA2C,IAA/BiI,EAAM,UAAE2B,EAAU,EAAVA,WAAYX,EAAI,EAAJA,KACpDhB,EAAOzY,IAAI,CAACoa,EAAYX,IAExB,IAAIhB,EAAO2D,EAAe,CACxBxD,cAAe,EACfc,KAAM,CACJC,KAAM,GAERU,WAAY,CACVC,YAAa,2BACblS,GAAI,EAAKkW,iBACT/D,WAAW,IAGjB,GAEJ,M,8EAAC,EA1B4C,C,QAElBiC,I,EAAU,E,EACpB,CAAC,SAAU,e,MADS,c,mmDCFQ,I,MAAA,e,sRAAA,U,MAAA,2B,4FAAA,iCAoD5C,O,EApD4C,G,EAAA,sBAU7C,WAAU,WACJ9e,OAAO0hB,YAAc,KACvB1Q,KAAK2Q,qBAAqBxgB,SAAQ,SAAAuI,GAChC,EAAKkY,oBAAoB,CAAExhB,cAAesJ,GAC5C,GAEJ,GAAC,iCAED,SAAoBxG,GAClB,IAAM8E,EAAQ9E,EAAM9C,cACdI,EAAUwH,EAAMvH,mBAGhBse,EAAwB,cAFhB/W,EAAMF,QAAQ+Z,kBAGtBthB,EAAWwe,EAAc,WAAa,YAEtCre,EAAgBF,EAAQG,aACxBC,GAAmC,EAAhBF,GAAmBG,QAAQ,GAEpDmH,EAAMvI,UAAUG,OAAO,YAEvBY,EAAQM,MAAMC,WAAa,cAAH,OAAiBH,EAAe,gCAAwBA,EAAe,eAC/FJ,EAAQM,MAAME,UAAY+d,EAAW,eACzBre,EAAa,aACrB,MAEJsH,EAAMF,QAAQ+Z,kBAAoBthB,CACpC,GAAC,6BAED,WACEyQ,KAAK8Q,eAAe3gB,SAAQ,SAAAoN,GAC1BA,EAAO9O,UAAUC,OAAO,qCAC1B,IACAsR,KAAK+Q,qBAAqBtiB,UAAUK,IAClC,8CAGF,IAAMU,EAAUwQ,KAAKgR,0BAA0BvhB,mBAC3CD,IACFA,EAAQM,MAAMC,WAAa,OAC3BP,EAAQM,MAAME,UAAY,GAAH,OAAMR,EAAQG,aAAY,MAErD,M,8EAAC,EApD4C,C,QAElBme,I,EAAU,E,EACpB,CACf,gBACA,sBACA,UACA,mB,MALmC,c,2wDCEvC,IAAMmD,EAAuB,OAAM,e,sRAAA,U,MAAA,2B,4FAAA,iCAqLhC,O,EArLgC,G,EAAA,sBAiBjC,WAAU,WACRjR,KAAKkR,aAAelR,KAAKkR,aAAatC,KAAK5O,MAE3CA,KAAKmR,eAAiB,KAEtBjI,MAAM,KAAD,OAAMlJ,KAAKoR,cAAY,OAAGpR,KAAKqR,mBACjCvP,MAAK,SAAAgL,GAAQ,OAAIA,EAASwE,MAAM,IAChCxP,MAAK,SAAAiL,GAGJ,GAFA,EAAKoE,eAAiB,EAAKI,kBAAkBxE,GAExC,EAAKoE,eAAV,CAKA,IAAMK,EAAiB,EAAKC,yBACtBC,EAAqB,EAAKC,uBAAuBH,GAEvD,EAAKI,qBAAqBF,GAC1B,EAAKG,uBACL,EAAKC,iBAPL,MAFE,EAAKC,UAAUjiB,MAAMkI,QAAU,MAUnC,IAAE,OACK,SAAAlG,GACL,EAAKigB,UAAUjiB,MAAMkI,QAAU,OAC/BqU,EAAAA,GAAwBva,EAC1B,GACJ,GAAC,wBAED,WAAa,QACW,QAAtB,EAAAkO,KAAKgS,yBAAiB,OAAtB,EAAwBrjB,oBAAoB,SAAUqR,KAAKkR,cAChD,QAAX,EAAAlR,KAAKiS,cAAM,OAAX,EAAanH,SACf,GAAC,+BAED,SAAkBiC,GAAM,WACtB,OAAOA,EAAKlO,QAAQqT,MAClB,SAAA3U,GAAM,OAAIA,EAAOQ,MAAQ,EAAKoU,aAAarb,QAAQsb,SAAS,GAEhE,GAAC,oCAED,WACE,OAAOpS,KAAKmR,eAAekB,OAAOC,KAAKrJ,OAAOrB,QAAO,SAAC2K,EAAK5Z,GACzD,IAAM6Z,EAAaD,EAAIE,WAAU,SAAAC,GAAK,OAAIA,EAAMhS,OAAS/H,EAAM+Z,KAAK,IASpE,OARoB,IAAhBF,EACFD,EAAIC,GAAYG,QAAQ1S,KAAK,CAAES,KAAM/H,EAAMia,MAAOja,MAAOA,EAAMA,QAE/D4Z,EAAItS,KAAK,CACPS,KAAM/H,EAAM+Z,MACZC,QAAS,CAAC,CAAEjS,KAAM/H,EAAMia,MAAOja,MAAOA,EAAMA,UAGzC4Z,CACT,GAAG,GACL,GAAC,oCAED,SAAuBf,GACrB,OAA8B,IAA1BA,EAAe/c,OACV+c,EAAe,GAAGmB,QAAQ7lB,KAAI,SAAA+lB,GAAM,MAAK,CAC9CnS,KAAMmS,EAAOnS,KACb/H,MAAOka,EAAOla,MACf,IAEM6Y,EAAe1kB,KAAI,SAAA4lB,GAAK,MAAK,CAClCE,MAAOF,EAAMhS,KACbiS,QAASD,EAAMC,QAAQ7lB,KAAI,SAAA+lB,GAAM,MAAK,CACpCnS,KAAMmS,EAAOnS,KACb/H,MAAOka,EAAOla,MACf,IACF,GAEL,GAAC,kCAED,SAAqB+Y,GACnB,IAEY5I,EAER9I,KAAKmR,eAHPkB,OACEC,KAAQxJ,MAIE,WAAVA,IACF9I,KAAK+R,UAAU3jB,cAAc,qBAAqB8J,YAChD,cACF8H,KAAKgS,kBAAkB5I,gBAAgB,YACvCpJ,KAAKgS,kBAAkBvjB,UAAUK,IAAI,oBAGvC,IAAMgkB,EAAW,CACfC,cAAyB,WAAVjK,EACfkK,eAAe,EACfC,YAAa,GACbC,WAAW,GAGblT,KAAKiS,OAAS,IAAIkB,IAAJ,CAAe,CAC3BlB,OAAQjS,KAAKgS,kBACbjF,KAAM2E,EACNoB,SAAUA,IAEZ9S,KAAKgS,kBAAkB9jB,iBAAiB,SAAU8R,KAAKkR,aACzD,GAAC,6BAED,WAAkB,MAChB,EAMIlR,KAAKmR,eALPkB,OAAM,IACJC,KAAQxJ,EAAK,EAALA,MAAO/P,EAAI,EAAJA,KAAMkQ,EAAM,EAANA,OACrBrS,EAAI,EAAJA,KACAwc,EAAE,EAAFA,GAIEjY,EAAO6E,KAAKqT,WACZC,EAAiBtT,KAAKiS,OAAOsB,cAC7BC,EAAsBF,EAAexmB,KACzC,SAAA0S,GAAE,OAAIyJ,EAAOiJ,MAAK,SAAAuB,GAAC,OAAIA,EAAE9a,QAAU6G,CAAE,KAAKA,CAAE,IAGxCkU,EAAe1T,KAAK2T,mBAAmB1a,QAC3C,SAAA2a,GAAW,OAAIA,EAAYza,OAAO,IAE9B0a,EAAiBH,EAAajf,OAAS,EAAIif,EAAa,GAAG/a,MAAQ,GAEnEyZ,EAAYpS,KAAKmS,aAAarb,QAAQsb,UACtC0B,EAAiB9T,KAAK+T,kBAAkBjd,QAAQgd,eAEhDE,EAAc,IAAI9d,iBAEK,EAFU,GACrCqH,OAAQ6U,EACRrb,YAAa+c,GAAc,wBACTld,EAAKmC,KAAI,KAAM8a,GAAc,4BAC7BT,EAAGra,KAAI,KAAM,aAAW,IAG9B,WAAV+P,EACFkL,EAAYlhB,IAAI,iBAAD,OACIiG,GAAI,OAAGkY,EAAoB,KAC5Cve,KAAKC,UAAU6gB,EAAoB,KAGrCA,EAAoBrjB,SAAQ,SAAA0iB,GAC1BmB,EAAY5d,OAAO,iBAAD,OACC2C,GAAI,OAAGkY,EAAoB,OAC5Cve,KAAKC,UAAUkgB,GAEnB,IAGF,IAAM3Q,EAAM,KAAH,OAAQlC,KAAKoR,aAAY,gCAAwB4C,GAE1D7Y,EAAKlL,aAAa,OAAQiS,GAEtBoR,EAAe7e,OACjB0G,EAAKiO,gBAAgB,YAErBjO,EAAKlL,aAAa,WAAY,WAElC,GAAC,kCAED,WAAuB,QACfgkB,EAC0B,QADX,EACnBjU,KAAKgS,kBAAkBlb,eAAO,OAAiB,QAAjB,EAA9B,EAAgCmd,uBAAe,WAAjB,EAA9B,EAAiDzc,MAAM,KAEzDwI,KAAKiS,OAAOiC,YAAYD,EAC1B,GAAC,0BAED,WACEjU,KAAK8R,iBACP,M,8EAAC,EArLgC,CAENhE,EAAAA,IAAU,cACpB,CACf,cACA,OACA,cACA,SACA,cACA,QACD,aAEe,CACdqG,YAAa1D,OACb2D,QAAS3D,Q,YCfb,IAAM4D,EAAW,WACHtmB,SAASwY,gBACjBzW,MAAMiY,YAAY,eAAgB,GAAF,OAAK/Y,OAAOsX,YAAW,MAC7D,EAEAtX,OAAOd,iBAAiB,SAAUmmB,GAElCA,G","sources":["webpack://coupler-io-marketing/./app/frontend/src/stimulus/controllers/ sync \\.js$","webpack://coupler-io-marketing/./app/frontend/src/utils/onDomReady.js","webpack://coupler-io-marketing/./app/frontend/src/utils/drawer.js","webpack://coupler-io-marketing/./app/frontend/src/utils/simpleBar.js","webpack://coupler-io-marketing/./app/frontend/src/utils/accordion.js","webpack://coupler-io-marketing/./app/frontend/src/utils/debounce.js","webpack://coupler-io-marketing/./app/frontend/src/utils/csrf.js","webpack://coupler-io-marketing/./app/frontend/src/api/appDomain.js","webpack://coupler-io-marketing/./app/frontend/src/api/config.js","webpack://coupler-io-marketing/./app/frontend/src/api/analytics.js","webpack://coupler-io-marketing/./app/frontend/src/utils/memoize.js","webpack://coupler-io-marketing/./app/frontend/src/api/index.js","webpack://coupler-io-marketing/./app/frontend/src/utils/horizontalCarousel.js","webpack://coupler-io-marketing/./app/frontend/src/utils/filterData.js","webpack://coupler-io-marketing/./app/frontend/src/utils/headerNav.js","webpack://coupler-io-marketing/./app/frontend/src/utils/multiselect.js","webpack://coupler-io-marketing/./app/frontend/src/utils/dashboardsFilter.js","webpack://coupler-io-marketing/./app/frontend/src/utils/rolesTabs.js","webpack://coupler-io-marketing/./app/frontend/src/utils/integrationsPopupPrevent.js","webpack://coupler-io-marketing/./app/frontend/src/utils/beacons.js","webpack://coupler-io-marketing/./app/frontend/src/utils/cookieConsent.js","webpack://coupler-io-marketing/./app/frontend/src/utils/tooltip.js","webpack://coupler-io-marketing/./app/frontend/src/utils/loadScript.js","webpack://coupler-io-marketing/./app/frontend/src/utils/wistiaLazyLoading.js","webpack://coupler-io-marketing/./app/frontend/src/utils/imgHighlights.js","webpack://coupler-io-marketing/./app/frontend/src/utils/infiniteSlider.js","webpack://coupler-io-marketing/./app/frontend/marketing/data-services-request.js","webpack://coupler-io-marketing/./app/frontend/marketing/plans.js","webpack://coupler-io-marketing/./app/frontend/marketing/image-cards.js","webpack://coupler-io-marketing/./app/frontend/src/utils/testimonialsCarousel.js","webpack://coupler-io-marketing/./app/frontend/src/utils/destinationsCarousel.js","webpack://coupler-io-marketing/./app/frontend/src/utils/similarSourcesCarousel.js","webpack://coupler-io-marketing/./app/frontend/src/utils/compareListCarousel.js","webpack://coupler-io-marketing/./app/frontend/src/utils/gridComponentCarousel.js","webpack://coupler-io-marketing/./app/frontend/src/stimulus/application.js","webpack://coupler-io-marketing/./app/frontend/src/stimulus/index.js","webpack://coupler-io-marketing/./app/frontend/src/utils/intervalToggle.js","webpack://coupler-io-marketing/./app/frontend/packs/marketing.js","webpack://coupler-io-marketing/./app/frontend/src/stimulus/controllers/dashboards_carousel_controller.js","webpack://coupler-io-marketing/./app/frontend/src/stimulus/controllers/footer_controller.js","webpack://coupler-io-marketing/./app/frontend/src/stimulus/controllers/hello_controller.js","webpack://coupler-io-marketing/./app/frontend/src/stimulus/controllers/homepage_video_controller.js","webpack://coupler-io-marketing/./app/frontend/src/stimulus/controllers/links_carousel_controller.js","webpack://coupler-io-marketing/./app/frontend/src/stimulus/controllers/metrics_calculator_controller.js","webpack://coupler-io-marketing/./app/frontend/src/stimulus/controllers/popular_integrations_controller.js","webpack://coupler-io-marketing/./app/frontend/src/stimulus/controllers/pricing_table_controller.js","webpack://coupler-io-marketing/./app/frontend/src/stimulus/controllers/setup_integration_controller.js","webpack://coupler-io-marketing/./app/frontend/src/utils/appHeight.js"],"sourcesContent":["var map = {\n\t\"./dashboards_carousel_controller.js\": 9012,\n\t\"./footer_controller.js\": 817,\n\t\"./hello_controller.js\": 6544,\n\t\"./homepage_video_controller.js\": 5644,\n\t\"./links_carousel_controller.js\": 1324,\n\t\"./metrics_calculator_controller.js\": 3450,\n\t\"./popular_integrations_controller.js\": 1343,\n\t\"./pricing_table_controller.js\": 3339,\n\t\"./setup_integration_controller.js\": 2848,\n\t\"src/stimulus/controllers/dashboards_carousel_controller.js\": 9012,\n\t\"src/stimulus/controllers/footer_controller.js\": 817,\n\t\"src/stimulus/controllers/hello_controller.js\": 6544,\n\t\"src/stimulus/controllers/homepage_video_controller.js\": 5644,\n\t\"src/stimulus/controllers/links_carousel_controller.js\": 1324,\n\t\"src/stimulus/controllers/metrics_calculator_controller.js\": 3450,\n\t\"src/stimulus/controllers/popular_integrations_controller.js\": 1343,\n\t\"src/stimulus/controllers/pricing_table_controller.js\": 3339,\n\t\"src/stimulus/controllers/setup_integration_controller.js\": 2848,\n\t\"stimulus/controllers/dashboards_carousel_controller.js\": 9012,\n\t\"stimulus/controllers/footer_controller.js\": 817,\n\t\"stimulus/controllers/hello_controller.js\": 6544,\n\t\"stimulus/controllers/homepage_video_controller.js\": 5644,\n\t\"stimulus/controllers/links_carousel_controller.js\": 1324,\n\t\"stimulus/controllers/metrics_calculator_controller.js\": 3450,\n\t\"stimulus/controllers/popular_integrations_controller.js\": 1343,\n\t\"stimulus/controllers/pricing_table_controller.js\": 3339,\n\t\"stimulus/controllers/setup_integration_controller.js\": 2848\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 2580;","export const onDomReady = callback => {\n if (document.readyState !== 'loading') {\n return setTimeout(callback, 0)\n } else {\n return document.addEventListener('DOMContentLoaded', () => callback())\n }\n}\n","import { onDomReady } from 'utils/onDomReady'\nimport { on } from 'delegated-events'\n\nonDomReady(() => {\n const body = document.querySelector('body')\n const hamburger = document.querySelector('.hamburger')\n const navigation = document.querySelector('.navigation')\n const navigationList = document.querySelector('.navigation-list')\n\n function handleFadeOutTransitionEnd() {\n navigation.classList.remove('visible')\n navigationList.removeEventListener(\n 'transitionend',\n handleFadeOutTransitionEnd\n )\n }\n\n const toggleDrawer = () => {\n body.classList.toggle('scroll-disabled')\n hamburger.classList.toggle('open')\n\n const isVisible = navigation.classList.contains('visible')\n\n if (isVisible) {\n navigationList.addEventListener(\n 'transitionend',\n handleFadeOutTransitionEnd\n )\n navigationList.classList.remove('fade-in')\n } else {\n navigation.classList.add('visible')\n\n setTimeout(() => {\n navigationList.classList.add('fade-in')\n }, 100)\n }\n }\n\n if (hamburger) {\n hamburger.addEventListener('click', toggleDrawer)\n }\n\n function closeNavigationMenu() {\n body.classList.remove('scroll-disabled')\n hamburger.classList.remove('open')\n navigationList.addEventListener('transitionend', handleFadeOutTransitionEnd)\n navigationList.classList.remove('fade-in')\n }\n\n on(\n 'click',\n `.navigation-submenu__link, .navigation-item-button--single, .navigation-sign-up, .navigation-action`,\n closeNavigationMenu\n )\n})\n","import 'simplebar'\n\nimport ResizeObserver from 'resize-observer-polyfill'\nwindow.ResizeObserver = ResizeObserver\n","import { onDomReady } from 'utils/onDomReady'\n\nonDomReady(() => {\n const items = document.querySelectorAll('.accordion-item > button')\n\n function toggleAccordion({ currentTarget: button }) {\n const isExpanded = button.getAttribute('aria-expanded') === 'true'\n const toggleTo = isExpanded ? 'false' : 'true'\n\n const content = button.nextElementSibling\n const contentHeight = content.scrollHeight\n\n const transitionSpeed = (contentHeight * 1.25).toFixed(2)\n\n content.style.transition = `max-height ${transitionSpeed}ms ease-out, opacity ${transitionSpeed}ms ease-out`\n content.style.maxHeight = isExpanded ? null : `${contentHeight}px`\n\n button.setAttribute('aria-expanded', toggleTo)\n }\n\n items.forEach(item => item.addEventListener('click', toggleAccordion))\n})\n","const debounce = (callback, wait = 300) => {\n let timeoutId = null\n\n return (...args) => {\n window.clearTimeout(timeoutId)\n\n timeoutId = window.setTimeout(() => {\n callback.apply(null, args)\n }, wait)\n }\n}\n\nexport default debounce\n","let csrfToken\n\nexport function getCsrfToken() {\n if (csrfToken) return csrfToken\n\n const csrfMeta = document.head.querySelector('[name=csrf-token][content]')\n return (csrfToken = csrfMeta ? csrfMeta.content : '')\n}\n","const appDomain = () => {\n const element = document.head.querySelector(\n \"meta[name='cpl-app-domain-host']\"\n )\n if (element) {\n return element.getAttribute('content')\n }\n\n return null\n}\n\nexport default appDomain\n","import axios from 'axios'\n\nimport { getCsrfToken } from 'utils/csrf'\nimport appDomain from './appDomain'\n\nconst SAFE_METHODS = ['head', 'get']\n\nconst requiresForgeryProtection = ({ method }) => {\n if (!method) return false\n return !SAFE_METHODS.includes(method.toLowerCase())\n}\n\nconst instance = axios.create({\n withCredentials: true,\n baseURL: `//${appDomain()}`\n})\n\ninstance.interceptors.request.use(\n config => {\n if (requiresForgeryProtection(config)) {\n config.headers['X-CSRF-Token'] = getCsrfToken()\n }\n return config\n },\n error => {\n return Promise.reject(error)\n }\n)\n\nexport default instance\n","import axios from 'api/config'\n\n// #goal avoid this request for feature specs to make them more stable and faster\n// #approach JS tests to mock this module to allow for selective testing\nconst currentEnv = process.env.RAILS_ENV || 'development'\nconst isTest = currentEnv === 'test'\n\nexport const trackEvent = (event, payload) => {\n if (isTest) {\n return Promise.resolve()\n }\n\n return axios.post('/api/analytics', {\n event,\n payload\n })\n}\n","export const memoize = fn => {\n const cache = new Map()\n return (...args) => {\n const strX = JSON.stringify(args)\n const result = cache.get(strX)\n if (typeof result !== 'undefined') {\n return result\n }\n\n cache.set(\n strX,\n fn(...args).catch(err => {\n cache.delete(strX)\n throw err\n })\n )\n return cache.get(strX)\n }\n}\n","import axios from 'api/config'\nimport { trackEvent } from 'api/analytics'\nimport { memoize } from 'utils/memoize'\n\nconst getUserInfoData = () => axios.get('/api/current_user').catch(() => null)\n\nconst getUserInfo = memoize(getUserInfoData)\n\nexport { getUserInfo, trackEvent }\n","import { onDomReady } from 'utils/onDomReady'\n\nconst updateControlsVisibility = carouselElement => {\n const carouselElementWrapper = carouselElement.parentElement\n\n const prevControl = carouselElementWrapper.querySelector(\n '.horizontal-carousel__control_prev'\n )\n const nextControl = carouselElementWrapper.querySelector(\n '.horizontal-carousel__control_next'\n )\n const arrowsControls = carouselElementWrapper.querySelector(\n '.horizontal-carousel__controls'\n )\n\n const isAtTop = carouselElement.scrollTop === 0\n const isAtBottom =\n carouselElement.scrollTop + carouselElement.clientHeight + 1 >=\n carouselElement.scrollHeight\n\n const isContentFits =\n carouselElement.scrollHeight <= carouselElement.clientHeight\n\n prevControl.classList.toggle('swiper-button-disabled', isAtTop)\n nextControl.classList.toggle('swiper-button-disabled', isAtBottom)\n arrowsControls.classList.toggle(\n 'horizontal-carousel__controls--hidden',\n isContentFits\n )\n carouselElementWrapper.classList.toggle('no-scroll', isContentFits)\n}\n\nonDomReady(() => {\n let scrollInterval\n\n const scrollAmount = 150\n\n const startScrolling = (element, direction) => {\n stopScrolling()\n scrollInterval = setInterval(() => {\n scrollTo(element, direction)\n }, 300)\n }\n\n const stopScrolling = () => {\n clearInterval(scrollInterval)\n }\n\n const scrollTo = (element, direction) => {\n const scrollIncrement = direction === 'up' ? -scrollAmount : scrollAmount\n element.scrollBy({\n top: scrollIncrement,\n behavior: 'smooth'\n })\n }\n\n const carousels = document.querySelectorAll('.horizontal-carousel')\n\n if (!carousels.length) return\n\n carousels.forEach(carouselElement => {\n const prevControl = carouselElement.parentElement.querySelector(\n '.horizontal-carousel__control_prev'\n )\n const nextControl = carouselElement.parentElement.querySelector(\n '.horizontal-carousel__control_next'\n )\n const arrowsControls = carouselElement.parentElement.querySelector(\n '.horizontal-carousel__controls'\n )\n\n if (!prevControl || !nextControl || !arrowsControls) return\n\n prevControl.addEventListener('mousedown', () => {\n startScrolling(carouselElement, 'up')\n })\n\n prevControl.addEventListener('mouseup', stopScrolling)\n\n nextControl.addEventListener('mousedown', () => {\n startScrolling(carouselElement, 'down')\n })\n\n nextControl.addEventListener('mouseup', stopScrolling)\n\n prevControl.addEventListener('click', () => {\n scrollTo(carouselElement, 'up')\n })\n\n nextControl.addEventListener('click', () => {\n scrollTo(carouselElement, 'down')\n })\n\n carouselElement.addEventListener('scroll', () => {\n updateControlsVisibility(carouselElement)\n })\n\n updateControlsVisibility(carouselElement)\n })\n})\n\nexport default updateControlsVisibility\n","import { on } from 'delegated-events'\nimport { onDomReady } from 'utils/onDomReady'\nimport debounce from 'utils/debounce'\nimport { trackEvent } from 'api/index'\nimport updateControlsVisibility from 'utils/horizontalCarousel'\n\nconst SECTION_SELECTOR = '.data-filter-section__content'\nconst SEARCH_SELECTOR = '.search__input'\nconst TYPES_SELECTOR = '.base-checkbox__input'\nconst TAB_SELECTOR = '.data-tab'\nconst TAB_MOBILE_SELECTOR = '.data-filter-mobile'\n\nconst ITEM_HIDDEN_CLASSNAME = 'hidden'\n\nconst LOAD_MORE_SELECTOR = '.load-more-data'\n\nconst DEFAULT_TAB_VALUE = 'All'\n\nconst INTEGRATIONS_TYPE = 'integrations'\nconst METRIC_DIMENSION_TYPE = 'metric_dimension'\n\nconst eventType = {\n [INTEGRATIONS_TYPE]: 'Marketing:Source',\n [METRIC_DIMENSION_TYPE]: 'Marketing:MetricDimension'\n}\n\nconst searchType = {\n [INTEGRATIONS_TYPE]: 'data source',\n [METRIC_DIMENSION_TYPE]: 'metrics and dimensions'\n}\n\nconst itemsPerPage = () => {\n if (window.matchMedia('(max-width: 650px)').matches) {\n return 10\n }\n if (window.matchMedia('(max-width: 1022px)').matches) {\n return 20\n }\n return Infinity\n}\n\nconst searchValues = {}\nconst tagValues = {}\nconst typeValues = {}\n\nconst visibleItemsCounts = {}\nconst showedMatchedItemsCounts = {}\nconst matchedItemsCounts = {}\n\nfunction updateURL(filterType) {\n const urlParams = new URLSearchParams()\n\n if (tagValues[filterType]) {\n urlParams.set(`tag_${filterType}`, tagValues[filterType])\n }\n\n typeValues[filterType].forEach(type =>\n urlParams.append(`type_${filterType}`, type)\n )\n\n window.history.replaceState(null, '', `?${urlParams.toString()}`)\n}\n\nfunction filterList(filterType) {\n const section = document.querySelector(\n `.data-filter-section__content[data-filter-type='${filterType}'`\n )\n if (!section) return\n\n showedMatchedItemsCounts[filterType] = 0\n matchedItemsCounts[filterType] = 0\n\n const items = Array.from(section.querySelectorAll('li.data-item'))\n const popularFor = section.dataset.destination\n\n items.forEach(item => {\n const {\n title,\n tag: itemTag,\n type: itemType,\n popular: popular\n } = item.dataset\n\n const isSearchMatch = title\n .toLowerCase()\n .trim()\n .includes(searchValues[filterType])\n const itemTags = itemTag ? itemTag.split(',') : []\n\n const isCategoryMatch =\n !tagValues[filterType] ||\n tagValues[filterType] === 'All' ||\n itemTags.includes(tagValues[filterType])\n\n const isTypeMatch =\n typeValues[filterType].length === 0 ||\n typeValues[filterType].includes(itemType)\n const isPopular = popular && popular.includes(popularFor)\n const isTagPopular = tagValues[filterType] === 'Popular'\n const coreMatch = isSearchMatch && isTypeMatch\n const match = coreMatch && (isTagPopular ? isPopular : isCategoryMatch)\n\n if (match) {\n if (\n showedMatchedItemsCounts[filterType] < visibleItemsCounts[filterType]\n ) {\n item.classList.remove(ITEM_HIDDEN_CLASSNAME)\n showedMatchedItemsCounts[filterType]++\n } else {\n item.classList.add(ITEM_HIDDEN_CLASSNAME)\n }\n matchedItemsCounts[filterType]++\n } else {\n item.classList.add(ITEM_HIDDEN_CLASSNAME)\n }\n })\n\n const isEmpty = items.every(item =>\n item.classList.contains(ITEM_HIDDEN_CLASSNAME)\n )\n section.classList.toggle('is-empty', isEmpty)\n\n const remainingItems =\n matchedItemsCounts[filterType] - visibleItemsCounts[filterType]\n section.querySelector(LOAD_MORE_SELECTOR).style.display =\n remainingItems > 0 ? 'inline-flex' : 'none'\n\n const searchTextEl = section.querySelector('.data-empty__title')\n if (searchTextEl) {\n searchTextEl.textContent = searchValues[filterType]\n ? `Sorry, couldn’t find \"${searchValues[filterType]}\" on the ${searchType[filterType]} list`\n : 'Sorry, no results match your criteria'\n }\n\n section.dataset.filtered = Boolean(searchValues[filterType])\n\n if (filterType == METRIC_DIMENSION_TYPE) {\n const carouselElement = document.querySelector(\n '.metric-dimension.horizontal-carousel'\n )\n\n updateControlsVisibility(carouselElement)\n }\n}\n\nconst scrollToStart = function () {\n const start = document.querySelector(\n '.data-filter-section--integrations .data-filter-section__box .anchor'\n )\n if (start) {\n start.scrollIntoView({ behavior: 'smooth', block: 'start' })\n }\n}\n\nfunction onTabChange(e, filterType) {\n tagValues[filterType] = e.target.value\n filterList(filterType)\n scrollToStart()\n}\n\nfunction getClosestFilterType(e) {\n return e.target.closest(SECTION_SELECTOR).dataset.filterType\n}\n\non(\n 'input',\n SEARCH_SELECTOR,\n debounce(e => {\n const filterType = getClosestFilterType(e)\n searchValues[filterType] = e.target.value?.toLowerCase()?.trim()\n filterList(filterType)\n trackEvent(`${eventType[filterType]}:Search`, {\n name: searchValues[filterType]\n })\n })\n)\n\non('submit', '.data-filter-search', e => {\n e.preventDefault()\n})\n\non('change', TAB_SELECTOR, e => {\n const filterType = getClosestFilterType(e)\n tagValues[filterType] = e.target.value\n onTabChange(e, filterType)\n updateURL(filterType)\n trackEvent(`${eventType[filterType]}:Category selected`, {\n name: tagValues[filterType]\n })\n})\n\non('change', TAB_MOBILE_SELECTOR, e => {\n const filterType = getClosestFilterType(e)\n tagValues[filterType] = e.target.value\n onTabChange(e, filterType)\n updateURL(filterType)\n trackEvent(`${eventType[filterType]}:Category selected`, {\n name: tagValues[filterType]\n })\n})\n\non('change', TYPES_SELECTOR, e => {\n const filterType = getClosestFilterType(e)\n typeValues[filterType] = Array.from(\n e.target.closest(SECTION_SELECTOR).querySelectorAll(TYPES_SELECTOR)\n )\n .filter(i => i.checked)\n .map(i => i.value)\n updateURL(filterType)\n filterList(filterType)\n scrollToStart()\n trackEvent(`${eventType[filterType]}:Type selected`, {\n name: typeValues[filterType].join(', ')\n })\n})\n\non('click', LOAD_MORE_SELECTOR, e => {\n const filterType = getClosestFilterType(e)\n visibleItemsCounts[filterType] += itemsPerPage()\n filterList(filterType)\n})\n\nonDomReady(() => {\n const sections = document.querySelectorAll(SECTION_SELECTOR)\n if (!sections) return\n\n sections.forEach(section => {\n const filterType = section.dataset.filterType\n const urlParams = new URLSearchParams(window.location.search)\n\n searchValues[filterType] = ''\n if (filterType == INTEGRATIONS_TYPE) {\n tagValues[filterType] =\n urlParams.get(`tag_${filterType}`) || DEFAULT_TAB_VALUE\n }\n typeValues[filterType] = urlParams.getAll(`type_${filterType}`).length\n ? urlParams.getAll(`type_${filterType}`)\n : []\n\n const searchInputEl = section.querySelector(SEARCH_SELECTOR)\n if (searchInputEl) {\n searchInputEl.value = ''\n }\n\n const sourceTypeElms = Array.from(section.querySelectorAll(TYPES_SELECTOR))\n\n sourceTypeElms.forEach(el => {\n el.checked = typeValues[filterType].includes(el.value)\n })\n\n const sourceTabEl = section.querySelector(\n `${TAB_SELECTOR}[value=\"${tagValues[filterType]}\"]`\n )\n if (sourceTabEl) {\n sourceTabEl.checked = true\n }\n\n const sourceTabMobileEl = section.querySelector(TAB_MOBILE_SELECTOR)\n if (sourceTabMobileEl) {\n sourceTabMobileEl.value = tagValues[filterType]\n }\n\n visibleItemsCounts[filterType] = itemsPerPage()\n\n filterList(filterType)\n })\n})\n","import { on } from 'delegated-events'\nimport { onDomReady } from 'utils/onDomReady'\nconst NAVIGATION_BUTTON = '.navigation-item-button--submenu'\nconst NAVIGATION_MENU = '.navigation-submenu'\nconst NAVIGATION_ITEM = '.navigation-item'\nconst NAVIGATION_OVERLAY = '.navigation__overlay'\n\nconst ACTIVE_CLASSNAME = 'active'\nconst HEADER_TRANSPARENT_CLASSNAME = 'header--transparent'\n\nconst navigationOverlay = document.querySelector(NAVIGATION_OVERLAY)\nconst buttons = document.querySelectorAll(NAVIGATION_BUTTON)\nconst submenus = document.querySelectorAll(NAVIGATION_MENU)\n\nconst isNormalScreen = window.matchMedia('(min-width: 1024px)').matches\n\nconst header = document.querySelector('.header')\n\nconst addHeaderTransparentClass = () => {\n const transparentPaths = [\n '/',\n '/looker-studio-connector',\n '/power-bi-connector',\n '/google-sheets-connector'\n ]\n\n if (transparentPaths.includes(window.location.pathname)) {\n header.classList.add(HEADER_TRANSPARENT_CLASSNAME)\n }\n}\n\nconst removeHeaderTransparentClassOnScroll = () => {\n const isSubMenuActive =\n document.querySelector(`${NAVIGATION_OVERLAY}.${ACTIVE_CLASSNAME}`) !== null\n\n if (window.scrollY > 0) {\n header.classList.remove(HEADER_TRANSPARENT_CLASSNAME)\n } else if (!isSubMenuActive) {\n addHeaderTransparentClass()\n }\n}\n\nconst removeItemActive = () => {\n submenus.forEach(submenu => {\n submenu.style.maxHeight = ''\n })\n\n buttons.forEach(button => {\n button.closest(NAVIGATION_ITEM).classList.remove(ACTIVE_CLASSNAME)\n })\n}\n\nconst closeNavigation = () => {\n submenus.forEach(submenu => {\n submenu.style.transition = ''\n })\n\n navigationOverlay.classList.remove(ACTIVE_CLASSNAME)\n\n removeItemActive()\n\n if (window.scrollY === 0) {\n addHeaderTransparentClass()\n }\n}\n\nconst handleButtonClick = event => {\n const parentItem = event.target.closest(NAVIGATION_ITEM)\n const submenuItem = event.target.nextElementSibling\n const isActive = parentItem.classList.contains(ACTIVE_CLASSNAME)\n const contentHeight = submenuItem.scrollHeight\n\n const hasActiveItem =\n Array.from(\n document.querySelectorAll(`${NAVIGATION_ITEM}.${ACTIVE_CLASSNAME}`)\n ).length > 0\n\n if (isNormalScreen && hasActiveItem) {\n submenus.forEach(submenu => {\n submenu.style.transition = isActive ? '' : 'none'\n })\n\n navigationOverlay.classList.remove(ACTIVE_CLASSNAME)\n\n if (window.scrollY === 0) {\n addHeaderTransparentClass()\n }\n }\n\n removeItemActive()\n\n if (!isActive) {\n parentItem.classList.add(ACTIVE_CLASSNAME)\n submenuItem.style.maxHeight = `${contentHeight}px`\n\n if (isNormalScreen) {\n navigationOverlay.classList.add(ACTIVE_CLASSNAME)\n }\n if (window.scrollY === 0) {\n header.classList.remove(HEADER_TRANSPARENT_CLASSNAME)\n }\n }\n}\n\non('click', NAVIGATION_BUTTON, handleButtonClick)\n\non(\n 'click',\n `.navigation-submenu__action--video, ${NAVIGATION_OVERLAY}`,\n closeNavigation\n)\n\nonDomReady(() => {\n var path = window.location.pathname\n var menuLinks = Array.from(document.querySelectorAll('.navigation a'))\n\n menuLinks.forEach(link => {\n if (link.getAttribute('href') === path) {\n link.classList.add('active')\n }\n })\n\n addHeaderTransparentClass()\n\n window.addEventListener('scroll', removeHeaderTransparentClassOnScroll)\n})\n","import { on } from 'delegated-events'\nimport { onDomReady } from 'utils/onDomReady'\n\nconst MULTISELECT_SELECTOR = '.multiselect'\nconst MULTISELECT_CLEAR_SELECTOR = '.multiselect__clear'\nconst MULTISELECT_TOGGLE_SELECTOR = '.multiselect__toggle'\nconst MULTISELECT_CHECKBOX_SELECTOR = '.multiselect__checkbox'\n\nconst MULTISELECT_ACTIVE_CLASSNAME = 'multiselect--active'\n\nconst MULTISELECT_SEARCH_SELECTOR = '.multiselect__search'\nconst MULTISELECT_ITEM_SELECTOR = '.multiselect__item'\n\nfunction handleSearch(event) {\n const searchTerm = event.target.value.toLowerCase().trim()\n const multiselect = event.target.closest(MULTISELECT_SELECTOR)\n const items = multiselect.querySelectorAll(MULTISELECT_ITEM_SELECTOR)\n\n items.forEach(item => {\n const text = item\n .querySelector('.multiselect__text')\n .textContent.toLowerCase()\n if (text.includes(searchTerm)) {\n item.style.display = ''\n } else {\n item.style.display = 'none'\n }\n })\n}\n\nfunction clearSearchInput(dropdown) {\n const searchInput = dropdown.querySelector(MULTISELECT_SEARCH_SELECTOR)\n if (searchInput) {\n searchInput.value = ''\n\n const items = dropdown.querySelectorAll(MULTISELECT_ITEM_SELECTOR)\n items.forEach(item => {\n item.style.display = ''\n })\n }\n}\n\nfunction focusSearchInput(multiselect) {\n if (window.matchMedia('(min-width: 1024px)').matches) {\n const searchInput = multiselect.querySelector(MULTISELECT_SEARCH_SELECTOR)\n if (searchInput) {\n searchInput.focus()\n }\n }\n}\n\nfunction toggleDropdown(event) {\n const dropdownToggle = event.target\n const dropdownMenu = dropdownToggle.closest(MULTISELECT_SELECTOR)\n dropdownMenu.classList.toggle(MULTISELECT_ACTIVE_CLASSNAME)\n\n if (dropdownMenu.classList.contains(MULTISELECT_ACTIVE_CLASSNAME)) {\n focusSearchInput(dropdownMenu)\n } else {\n clearSearchInput(dropdownMenu)\n }\n}\n\nfunction outsideDropdownClick(event) {\n const target = event.target\n const dropdowns = document.querySelectorAll(MULTISELECT_SELECTOR)\n\n dropdowns.forEach(dropdown => {\n if (!dropdown.contains(target)) {\n clearSearchInput(dropdown)\n dropdown.classList.remove(MULTISELECT_ACTIVE_CLASSNAME)\n }\n })\n}\n\nfunction updateSelectedItems(multiselect, clearButton) {\n const selectedItemsContainer = multiselect.querySelector(\n MULTISELECT_TOGGLE_SELECTOR\n )\n const originalText = selectedItemsContainer.getAttribute('data-text')\n const checkboxes = multiselect.querySelectorAll(\n MULTISELECT_CHECKBOX_SELECTOR + ':checked'\n )\n\n if (checkboxes.length === 0) {\n selectedItemsContainer.textContent = `All ${originalText}`\n } else if (checkboxes.length === 1) {\n selectedItemsContainer.textContent = checkboxes[0].value\n } else {\n selectedItemsContainer.textContent = `${checkboxes.length} ${originalText} selected`\n }\n\n clearButton.textContent = `Clear All ${\n checkboxes.length ? '(' + checkboxes.length + ')' : ''\n }`\n}\n\nexport function updateSelectedItemsOnPageLoad() {\n const multiselects = document.querySelectorAll(MULTISELECT_SELECTOR)\n multiselects.forEach(multiselect => {\n const clearButton = multiselect.querySelector(MULTISELECT_CLEAR_SELECTOR)\n updateSelectedItems(multiselect, clearButton)\n })\n}\n\nfunction clearAllItems(event, excludeCheckbox = null) {\n event.preventDefault()\n const multiselect = event.target.closest(MULTISELECT_SELECTOR)\n const checkboxes = multiselect.querySelectorAll(\n MULTISELECT_CHECKBOX_SELECTOR + ':checked'\n )\n const clearButton = multiselect.querySelector(MULTISELECT_CLEAR_SELECTOR)\n\n checkboxes.forEach(checkbox => {\n if (checkbox !== excludeCheckbox) {\n checkbox.checked = false\n }\n })\n\n updateSelectedItems(multiselect, clearButton)\n}\n\non('click', MULTISELECT_TOGGLE_SELECTOR, toggleDropdown)\ndocument.addEventListener('click', outsideDropdownClick)\n\non('change', MULTISELECT_CHECKBOX_SELECTOR, event => {\n event.stopPropagation()\n const multiselectMenu = event.target.closest(MULTISELECT_SELECTOR)\n const clearButton = multiselectMenu.querySelector(MULTISELECT_CLEAR_SELECTOR)\n const isSingleSelect =\n multiselectMenu.getAttribute('data-single-select') === 'true'\n\n if (isSingleSelect) {\n clearAllItems(event, event.target)\n }\n\n updateSelectedItems(multiselectMenu, clearButton)\n focusSearchInput(multiselectMenu)\n})\n\non('click', MULTISELECT_CLEAR_SELECTOR, clearAllItems)\n\nonDomReady(() => {\n updateSelectedItemsOnPageLoad()\n})\n\non('input', MULTISELECT_SEARCH_SELECTOR, handleSearch)\n","import { onDomReady } from 'utils/onDomReady'\nimport debounce from 'utils/debounce'\nimport { on } from 'delegated-events'\nimport { trackEvent } from 'api/index'\n\nimport { updateSelectedItemsOnPageLoad } from './multiselect'\n\nconst DASHBOARD_SEARCH_SELECTOR = '.dashboards-search__input'\nconst ITEM_HIDDEN_CLASSNAME = 'dashboard--hidden'\nconst DASHBOARD_MULTISELECT_CLEAR_SELECTOR =\n '.dashboards__filter .multiselect__clear'\nconst DASHBOARD_LOAD_MORE_SELECTOR = '.load-more-dashboards'\nconst DASHBOARD_ACTION_ANCHOR = '.dashboard-action-anchor'\n\nconst itemsPerPage = () => {\n if (window.matchMedia('(max-width: 650px)').matches) {\n return 10\n }\n if (window.matchMedia('(max-width: 1022px)').matches) {\n return 10\n }\n return 9\n}\n\nlet visibleItemsCount = itemsPerPage()\nlet categoryValue = []\nlet categoryValueURL = []\nlet sourceValue = []\nlet destinationValue = []\nlet searchValue = ''\nlet fullItemList = []\n\nfunction updateURL() {\n const urlParams = new URLSearchParams()\n\n if (categoryValueURL.length > 0) {\n urlParams.append('category', categoryValueURL[0])\n }\n\n if (sourceValue.length > 0) {\n sourceValue.forEach(source => {\n urlParams.append('source', source)\n })\n }\n\n if (destinationValue.length > 0) {\n destinationValue.forEach(destination => {\n urlParams.append('destination', destination)\n })\n }\n\n window.history.replaceState(null, '', `?${urlParams.toString()}`)\n}\n\nconst scrollToStart = function () {\n const start = document.querySelector(\n '.data-filter-section--dashboards .anchor'\n )\n start.scrollIntoView({ behavior: 'smooth', block: 'start' })\n}\n\nconst categoryHierarchyElement = document.querySelector('.data-filter-section')\nconst categoryHierarchyData = categoryHierarchyElement?.dataset.categories\n ? JSON.parse(categoryHierarchyElement.dataset.categories)\n : null\n\nconst categoryHierarchy = categoryHierarchyData\n ? Object.fromEntries(\n Object.entries(categoryHierarchyData).map(([key, value]) => [\n key,\n [key, ...(value.children || [])]\n ])\n )\n : {}\n\nconst handleCheckboxChange = function () {\n const value = this.value\n let array, eventName\n\n switch (this.name) {\n case 'categories-checkboxes':\n if (categoryValueURL.includes(value)) {\n categoryValue = []\n categoryValueURL = []\n } else {\n categoryValue = categoryHierarchy[value]\n categoryValueURL = [value]\n }\n\n eventName = 'Marketing:Templates:Category selected'\n\n trackEvent(eventName, {\n name: categoryValue[0] || 'None'\n })\n break\n case 'sources-checkboxes':\n case 'destinations-checkboxes':\n array =\n this.name === 'sources-checkboxes' ? sourceValue : destinationValue\n eventName =\n this.name === 'sources-checkboxes'\n ? 'Marketing:Templates:Source selected'\n : 'Marketing:Templates:Destination selected'\n\n if (this.checked) {\n array.push(value)\n } else {\n const index = array.indexOf(value)\n if (index !== -1) array.splice(index, 1)\n }\n\n trackEvent(eventName, {\n name: array.join(', ')\n })\n break\n default:\n return\n }\n\n updateURL()\n filterList()\n scrollToStart()\n}\n\nconst sortDashboards = (dashboards, selectedCategory) => {\n return dashboards.sort((a, b) => {\n const isAPrimary =\n a.dataset.primaryCategory?.trim().toLowerCase() ===\n selectedCategory?.trim().toLowerCase()\n const isBPrimary =\n b.dataset.primaryCategory?.trim().toLowerCase() ===\n selectedCategory?.trim().toLowerCase()\n\n if (isAPrimary !== isBPrimary) return isBPrimary - isAPrimary\n\n if (sourceValue.length > 0) {\n const singleSourceDiff =\n (b.parsedData.sources.length === 1) -\n (a.parsedData.sources.length === 1)\n if (singleSourceDiff) return singleSourceDiff\n }\n\n return Number(b.dataset.position) - Number(a.dataset.position)\n })\n}\n\nconst filterList = () => {\n const list = document.querySelector('.data-filter-section .dashboards__list')\n if (!list) return\n\n const sortedItems = sortDashboards([...fullItemList], categoryValueURL[0])\n\n list.innerHTML = ''\n\n let showedMatchedItemsCount = 0\n let matchedItemsCount = 0\n\n const isItemMatched = item => {\n const {\n title,\n categories: itemCategories,\n sources: itemSources,\n destinations: itemDestinations\n } = item.parsedData\n\n const isSearchMatch = searchValue.length\n ? [title, ...itemSources, ...itemDestinations].some(it =>\n it.toLowerCase().trim().includes(searchValue)\n )\n : true\n\n const isCategoriesMatch = categoryValue.length\n ? categoryValue.some(item => itemCategories.includes(item))\n : true\n\n const isSourcesMatch = sourceValue.length\n ? sourceValue.some(item => itemSources.includes(item))\n : true\n\n const isDestinationsMatch = destinationValue.length\n ? destinationValue.some(item => itemDestinations.includes(item))\n : true\n\n return (\n isSearchMatch &&\n isCategoriesMatch &&\n isSourcesMatch &&\n isDestinationsMatch\n )\n }\n\n sortedItems.forEach(item => {\n if (isItemMatched(item)) {\n if (showedMatchedItemsCount < visibleItemsCount) {\n item.classList.remove(ITEM_HIDDEN_CLASSNAME)\n showedMatchedItemsCount++\n } else {\n item.classList.add(ITEM_HIDDEN_CLASSNAME)\n }\n list.appendChild(item)\n matchedItemsCount++\n } else {\n item.classList.add(ITEM_HIDDEN_CLASSNAME)\n }\n })\n\n const isEmpty = sortedItems.every(item =>\n item.classList.contains(ITEM_HIDDEN_CLASSNAME)\n )\n\n list.classList.toggle('is-empty', isEmpty)\n\n const remainingItems = matchedItemsCount - visibleItemsCount\n\n document.querySelector(DASHBOARD_LOAD_MORE_SELECTOR).style.display =\n remainingItems > 0 ? 'inline-flex' : 'none'\n}\n\non('submit', '.dashboards__filter', e => {\n e.preventDefault()\n})\n\non(\n 'input',\n DASHBOARD_SEARCH_SELECTOR,\n debounce(e => {\n searchValue = e.target.value?.toLowerCase()?.trim() ?? ''\n filterList()\n trackEvent('Marketing:Templates:Search', { name: searchValue })\n })\n)\n\non(\n 'change',\n `[name=\"sources-checkboxes\"], [name=\"categories-checkboxes\"], [name=\"destinations-checkboxes\"]`,\n handleCheckboxChange\n)\n\nconst syncFiltersFromURL = function () {\n const urlParams = new URLSearchParams(window.location.search)\n\n categoryValueURL = urlParams.getAll('category')\n categoryValue = categoryValueURL.flatMap(value => categoryHierarchy[value])\n\n sourceValue = urlParams.getAll('source')\n destinationValue = urlParams.getAll('destination')\n searchValue = ''\n\n const categoryCheckboxes = document.querySelectorAll(\n `[name=\"categories-checkboxes\"]`\n )\n\n const sourceCheckboxes = document.querySelectorAll(\n `[name=\"sources-checkboxes\"]`\n )\n\n const destinationCheckboxes = document.querySelectorAll(\n `[name=\"destinations-checkboxes\"]`\n )\n\n categoryCheckboxes.forEach(checkbox => {\n checkbox.checked = categoryValueURL.includes(checkbox.value)\n })\n\n sourceCheckboxes.forEach(checkbox => {\n checkbox.checked = sourceValue.includes(checkbox.value)\n })\n\n destinationCheckboxes.forEach(checkbox => {\n checkbox.checked = destinationValue.includes(checkbox.value)\n })\n\n updateSelectedItemsOnPageLoad()\n}\n\nonDomReady(() => {\n syncFiltersFromURL()\n\n fullItemList = Array.from(\n document.querySelectorAll('.data-filter-section .dashboard')\n ).map(item => {\n item.parsedData = {\n title: item.dataset.title,\n text: item.dataset.text,\n categories: JSON.parse(item.dataset.categories),\n sources: JSON.parse(item.dataset.sources),\n destinations: JSON.parse(item.dataset.destinations)\n }\n return item\n })\n\n filterList()\n})\n\non('click', DASHBOARD_LOAD_MORE_SELECTOR, () => {\n visibleItemsCount += itemsPerPage()\n filterList()\n})\n\non('click', DASHBOARD_MULTISELECT_CLEAR_SELECTOR, event => {\n const { collection } = event.target.dataset\n switch (collection) {\n case 'categories': {\n categoryValue = []\n categoryValueURL = []\n break\n }\n case 'sources': {\n sourceValue = []\n break\n }\n case 'destinations': {\n destinationValue = []\n break\n }\n }\n updateURL()\n filterList()\n})\n\non('click', DASHBOARD_ACTION_ANCHOR, e => {\n e.preventDefault()\n\n const href = e.target.closest(DASHBOARD_ACTION_ANCHOR).getAttribute('href')\n\n const [baseUrl, anchor] = href.split('#')\n\n if (baseUrl) {\n const newParams = new URLSearchParams(baseUrl.split('?')[1] || '')\n\n const newUrl = `${window.location.pathname}?${newParams.toString()}${\n anchor ? `#${anchor}` : ''\n }`\n\n window.history.pushState(null, '', newUrl)\n\n syncFiltersFromURL()\n filterList()\n }\n\n if (anchor) {\n const targetElement = document.querySelector(`#${anchor}`)\n if (targetElement) {\n targetElement.scrollIntoView({ behavior: 'smooth', block: 'start' })\n }\n }\n})\n","import { onDomReady } from 'utils/onDomReady'\n\nonDomReady(() => {\n const tabs = document.querySelectorAll('.roles-toggle__input')\n const tabContents = document.querySelectorAll('.roles-tab')\n\n tabs.forEach((tab, index) => {\n tab.addEventListener('change', () => {\n tabContents.forEach(content => content.classList.remove('active'))\n tabContents[index].classList.add('active')\n })\n })\n})\n","import { on } from 'delegated-events'\n\non('click', '.integrations-item-premium', e => {\n e.preventDefault()\n})\n","import { on } from 'delegated-events'\n\non('click', '.custom-integration-beacon', e => {\n e.preventDefault()\n\n if (!window.Beacon) return\n\n window.Beacon('open')\n window.Beacon('navigate', '/ask/message/')\n window.Beacon('prefill', {\n subject: 'Custom Integration Request',\n text: [\n `Hi, I would like to export data from [list the desired apps]. What would be the cost of such integration?`,\n '[Tip: Provide more details about your case so we can offer a solution that best fits your needs. If possible, explain what data you need to export, where to, whether you have specific requirements to the output format, etc.]'\n ].join('\\n')\n })\n})\n\non('click', '.premium-integration-beacon', e => {\n e.preventDefault()\n\n const sourceName = e.target.value ? e.target.value : '[list the desired apps]'\n\n if (!window.Beacon) return\n\n window.Beacon('open')\n window.Beacon('navigate', '/ask/message/')\n window.Beacon('prefill', {\n subject: 'Early access source setup request',\n text: [\n `Hi! I would like to request ${sourceName} setup. This is what I expect from the integration: ...`,\n '[Tip: Provide more details about your case so we can offer a solution that best fits your needs.]'\n ].join('\\n')\n })\n})\n\non('click', '.support-team-beacon', e => {\n e.preventDefault()\n\n if (!window.Beacon) return\n\n window.Beacon('open')\n window.Beacon('navigate', '/ask/message/')\n window.Beacon('prefill', {\n subject: 'Special terms for non-profit and educational organizations'\n })\n})\n","import Cookies from 'js-cookie'\nimport { on } from 'delegated-events'\n\nimport { onDomReady } from 'utils/onDomReady'\n\nonDomReady(() => {\n setTimeout(() => {\n if (window.Cookiebot) return\n\n const consent = document.querySelector('.cookie-consent')\n if (!consent) return\n\n if (!Cookies.get('hide_cookie_consent')) {\n consent.classList.add('visible')\n }\n\n on('click', '#cookieConsentButton', () => {\n Cookies.set('hide_cookie_consent', 'yes', {\n expires: 365,\n path: '/'\n })\n consent.classList.remove('visible')\n if (window.dataLayer) {\n window.dataLayer.push({ event: 'cookie_consent_update' })\n }\n })\n }, 5000)\n})\n","import { onDomReady } from 'utils/onDomReady'\n\nonDomReady(() => {\n const tippyElements = document.querySelectorAll('[data-tippy-content]')\n if (!tippyElements || !tippyElements.length) return\n\n import('tippy.js').then(({ default: tippy }) => {\n tippy(tippyElements, {\n placement: 'bottom'\n })\n })\n})\n","import { memoize } from './memoize'\n\nexport const loadScript = memoize(\n url =>\n new Promise((resolve, reject) => {\n const script = document.createElement('script')\n\n script.setAttribute('src', url)\n script.setAttribute('async', 'async')\n\n script.onload = resolve\n script.onerror = reject\n\n document.head.appendChild(script)\n })\n)\n","import { onDomReady } from 'utils/onDomReady'\nimport { loadScript } from 'utils/loadScript'\n\nconst loadWistia = () =>\n loadScript('https://fast.wistia.com/assets/external/E-v1.js')\n\nconst intersectionCallback = (entries, observer) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n loadWistia().then(() => observer.disconnect())\n }\n })\n}\n\nonDomReady(() => {\n const targets = document.querySelectorAll('.mainFeatureVideo')\n if (targets.length == 0) return\n\n const options = {\n root: null,\n rootMargin: '0px',\n threshold: 0.3\n }\n const observer = new IntersectionObserver(intersectionCallback, options)\n targets.forEach(target => {\n observer.observe(target)\n })\n})\n","import { on } from 'delegated-events'\nimport ProgressBar from 'progressbar.js'\n\nlet defaultIndexValues = {}\nlet cuttentActiveItem = {}\nlet isIntervalActive = {}\nlet intervalIds = {}\nlet progressBarLine = {}\nlet pausedProgressBars = {}\n\nconst timerDuration = 15000\n\nconst updateProgressBar = (progressBarElement, progressBarKey) => {\n if (progressBarLine[progressBarKey]) {\n progressBarLine[progressBarKey].set(0)\n } else {\n progressBarLine[progressBarKey] = new ProgressBar.Line(progressBarElement, {\n strokeWidth: 5,\n easing: 'linear',\n duration: timerDuration,\n trailWidth: 5,\n svgStyle: { width: '100%', height: '100%' }\n })\n }\n\n progressBarLine[progressBarKey].animate(1.0)\n}\n\nconst updateAccordionState = (containerId, index) => {\n const container = document.querySelector(\n `.img-highlights[data-container-id=\"${containerId}\"]`\n )\n if (!container) return\n\n const items = container.querySelectorAll(\n '.img-highlights-accordion__item > button'\n )\n const images = container.querySelectorAll('.img-highlights-img__wrap')\n\n items.forEach((item, itemIndex) => {\n item.setAttribute('aria-expanded', itemIndex == index ? 'true' : 'false')\n })\n\n images.forEach((image, imageIndex) => {\n image.classList.toggle('active', imageIndex == index)\n })\n\n const activeItem = items[index]\n const content = activeItem.nextElementSibling\n const progressBarElement = content.querySelector(\n '.img-highlights-accordion__progress-bar'\n )\n const progressBarKey = `${containerId}-${index}`\n const contentHeight = content.scrollHeight\n const transitionSpeed = (contentHeight * 1.25).toFixed(2)\n\n content.style.transition = `max-height ${transitionSpeed}ms ease-out, opacity ${transitionSpeed}ms ease-out`\n content.style.maxHeight = `${contentHeight}px`\n\n updateProgressBar(progressBarElement, progressBarKey)\n startAutoSwitching(containerId, items.length)\n}\n\nconst setDefaultIndex = (containerId, defaultIndexValue) => {\n defaultIndexValues[containerId] = defaultIndexValue\n cuttentActiveItem[containerId] = defaultIndexValue\n\n updateAccordionState(containerId, defaultIndexValue)\n}\n\nconst updateAccordionFromLink = () => {\n const pageHash = window.location.hash.substring(1)\n const splitHash = pageHash.split('?')\n\n const blockId = splitHash[0]\n const blockIndex = parseInt(splitHash[1], 10)\n\n const element = document.getElementById(blockId)\n element?.scrollIntoView({\n behavior: 'smooth'\n })\n\n if (blockId && blockIndex) {\n cuttentActiveItem[blockId] = blockIndex\n resetAutoSwitching(blockId)\n updateAccordionState(blockId, blockIndex)\n }\n}\n\nfunction autoSwitchAccordion(containerId, numItems) {\n const container = document.querySelector(\n `.img-highlights[data-container-id=\"${containerId}\"]`\n )\n if (!container) return\n\n const currentIndex = cuttentActiveItem[containerId] || 0\n const nextIndex = (currentIndex + 1) % numItems\n\n cuttentActiveItem[containerId] = nextIndex\n updateAccordionState(containerId, nextIndex)\n}\n\nfunction startAutoSwitching(containerId, numItems) {\n if (!isIntervalActive[containerId]) {\n intervalIds[containerId] = setInterval(() => {\n autoSwitchAccordion(containerId, numItems)\n }, timerDuration)\n isIntervalActive[containerId] = true\n }\n}\n\nfunction resetAutoSwitching(containerId) {\n if (isIntervalActive[containerId]) {\n clearInterval(intervalIds[containerId])\n isIntervalActive[containerId] = false\n }\n}\n\nfunction pauseAutoSwitching(containerId, progressBarKey) {\n if (isIntervalActive[containerId]) {\n clearInterval(intervalIds[containerId])\n progressBarLine[progressBarKey].pause()\n pausedProgressBars[progressBarKey] = progressBarLine[progressBarKey].value()\n isIntervalActive[containerId] = false\n }\n}\n\nfunction resumeAutoSwitching(containerId, progressBarKey, numItems) {\n if (!isIntervalActive[containerId]) {\n const pausedProgress = pausedProgressBars[progressBarKey]\n const remainingTime = (1.0 - pausedProgress) * timerDuration\n\n progressBarLine[progressBarKey].resume()\n\n const timerId = setTimeout(() => {\n autoSwitchAccordion(containerId, numItems)\n\n intervalIds[containerId] = setInterval(() => {\n autoSwitchAccordion(containerId, numItems)\n }, timerDuration)\n }, remainingTime)\n\n intervalIds[containerId] = timerId\n isIntervalActive[containerId] = true\n }\n}\n\nfunction updatePauseResumeAutoSwitching(containerId, itemsLength) {\n const container = document.querySelector(\n `.img-highlights[data-container-id=\"${containerId}\"]`\n )\n if (!container) return\n\n const isContainerVisible = isElementInViewport(container)\n const currentIndex = cuttentActiveItem[containerId] || 0\n const progressBarKey = `${containerId}-${currentIndex}`\n\n if (isContainerVisible) {\n if (!isIntervalActive[containerId]) {\n resumeAutoSwitching(containerId, progressBarKey, itemsLength)\n }\n } else {\n if (isIntervalActive[containerId]) {\n pauseAutoSwitching(containerId, progressBarKey)\n }\n }\n}\n\nfunction isElementInViewport(el, visibleThreshold = 0.6) {\n const rect = el.getBoundingClientRect()\n const windowHeight =\n window.innerHeight || document.documentElement.clientHeight\n\n return (\n rect.top + (1 - visibleThreshold) * rect.height >= 0 &&\n rect.top + visibleThreshold * rect.height <= windowHeight\n )\n}\n\nwindow.addEventListener('load', function () {\n const containers = document.querySelectorAll('.img-highlights')\n\n containers.forEach(container => {\n const { containerId } = container.dataset\n const items = container.querySelectorAll(\n '.img-highlights-accordion__item > button'\n )\n const itemsContent = container.querySelectorAll(\n '.img-highlights-accordion__item .img-highlights-accordion__box'\n )\n const itemsLength = itemsContent.length\n\n function toggleAccordion({ currentTarget: button }) {\n const isExpanded = button.getAttribute('aria-expanded') === 'true'\n\n if (isExpanded) {\n return\n }\n\n const buttonIndex = Array.from(items).indexOf(button)\n\n cuttentActiveItem[containerId] = buttonIndex\n\n resetAutoSwitching(containerId)\n updateAccordionState(containerId, buttonIndex)\n }\n\n function pauseAccordion() {\n const itemIndex = Array.from(itemsContent).indexOf(this)\n const progressBarKey = `${containerId}-${itemIndex}`\n pauseAutoSwitching(containerId, progressBarKey)\n }\n\n function resumeAccordion() {\n const itemIndex = Array.from(itemsContent).indexOf(this)\n const progressBarKey = `${containerId}-${itemIndex}`\n resumeAutoSwitching(containerId, progressBarKey, itemsLength)\n }\n\n items.forEach(item => item.addEventListener('click', toggleAccordion))\n itemsContent.forEach(itemBlock => {\n itemBlock.addEventListener('mouseenter', pauseAccordion)\n itemBlock.addEventListener('mouseleave', resumeAccordion)\n })\n\n if (items.length > 0) {\n const defaultIndexValue = defaultIndexValues[containerId] || 0\n setDefaultIndex(containerId, defaultIndexValue)\n pauseAutoSwitching(containerId, `${containerId}-${defaultIndexValue}`)\n }\n\n window.addEventListener('scroll', () =>\n updatePauseResumeAutoSwitching(containerId, itemsLength)\n )\n })\n\n if (containers.length > 0) {\n setTimeout(updateAccordionFromLink, 500)\n on('click', '.navigation-submenu__link', () => {\n setTimeout(updateAccordionFromLink, 100)\n })\n }\n})\n","import { onDomReady } from 'utils/onDomReady'\nimport { on } from 'delegated-events'\n\nonDomReady(() => {\n const sliderTracks = document.querySelectorAll('.infinite-slider')\n\n if (!sliderTracks) {\n return\n }\n\n sliderTracks.forEach(sliderTrack => {\n const isClientSlider = sliderTrack.closest('.clients__slider')\n\n if (isClientSlider && window.matchMedia('(min-width: 1025px)').matches) {\n const boxes = sliderTrack.querySelectorAll('.clients__box')\n const totalBoxes = boxes.length\n let currentIndex = 0\n\n const hideAllBoxes = () => {\n boxes.forEach(box => {\n box.classList.remove('clients__box--active')\n })\n }\n\n const showBox = index => {\n if (boxes[index]) {\n boxes[index].classList.add('clients__box--active')\n }\n }\n\n showBox(currentIndex)\n\n setInterval(() => {\n currentIndex += 1\n if (currentIndex >= totalBoxes) {\n currentIndex = 0\n }\n hideAllBoxes()\n showBox(currentIndex)\n }, 5000)\n\n return\n }\n\n const sliderItems = sliderTrack.querySelectorAll('.infinite-slider__item')\n const trackWidth = sliderTrack.offsetWidth\n const sliderItemsArray = Array.from(sliderItems)\n let totalWidth = sliderItemsArray.reduce(\n (agg, item) => agg + item.offsetWidth,\n 0\n )\n let itemsWidth = totalWidth\n\n sliderTrack.style.setProperty('--totalWidth', `${totalWidth}px`)\n\n if (totalWidth < trackWidth) {\n while (totalWidth < trackWidth) {\n sliderItems.forEach(item => {\n const clonedItem = item.cloneNode(true)\n sliderTrack.appendChild(clonedItem)\n totalWidth += item.offsetWidth\n })\n }\n }\n\n let cloneOffset = 0\n\n while (cloneOffset < trackWidth) {\n sliderItems.forEach(item => {\n const clonedItem = item.cloneNode(true)\n sliderTrack.appendChild(clonedItem)\n cloneOffset += item.offsetWidth\n })\n }\n\n const direction = sliderTrack.dataset.direction || 'right'\n\n let animationDuration = itemsWidth / 20\n\n if (window.matchMedia('(max-width: 767px)').matches) {\n const speedMobile = sliderTrack.dataset.speedMobile || 1\n animationDuration = animationDuration * speedMobile\n } else {\n const speed = sliderTrack.dataset.speed || 1\n animationDuration = animationDuration * speed\n }\n\n if (direction === 'right') {\n sliderTrack.style.animation = `slide ${animationDuration}s linear infinite`\n } else if (direction === 'left') {\n sliderTrack.style.animation = `slide-left ${animationDuration}s linear infinite`\n }\n\n on('mouseover', '.infinite-slider--hover', function (event) {\n event.currentTarget.style.animationPlayState = 'paused'\n })\n\n on('mouseout', '.infinite-slider--hover', function (event) {\n event.currentTarget.style.animationPlayState = 'running'\n })\n })\n})\n","import { on } from 'delegated-events'\n\nconst REQUIRED_FIELDS = ['first_name', 'last_name', 'email', 'request_details']\nconst TYPE_CHECKBOX_FIELDS = [\n 'data_visualization_type',\n 'data_infrastructure_type',\n 'business_analytics_type',\n 'data_automation_type'\n]\nconst INPUT_ERROR_CLASS = 'base-input--error'\n\nconst successIcon = `\n \n`\nconst alertIcon = `\n \n`\n\non('submit', 'form#data-services-request-form', e => {\n e.preventDefault()\n const form = e.currentTarget\n const submitButton = document.getElementById('data-services-request-submit')\n submitButton.classList.remove('success', 'danger')\n submitButton.textContent = 'Submit'\n\n let hasErrors = false\n\n REQUIRED_FIELDS.forEach(field => {\n const input = document.getElementById(field)\n if (input) {\n input.classList.remove(INPUT_ERROR_CLASS)\n\n if (!input.value || !input.value.length) {\n hasErrors = true\n input.classList.add(INPUT_ERROR_CLASS)\n }\n }\n })\n\n if (hasErrors) {\n return\n }\n\n const inputValues = REQUIRED_FIELDS.reduce((agg, field) => {\n const input = document.getElementById(field)\n if (input) {\n return {\n ...agg,\n [field]: input.value\n }\n }\n\n return agg\n }, {})\n\n const values = TYPE_CHECKBOX_FIELDS.reduce((agg, field) => {\n const checkbox = document.getElementById(field)\n if (checkbox && checkbox.checked) {\n return {\n ...agg,\n [field]: checkbox.checked\n }\n }\n\n return agg\n }, inputValues)\n\n submitButton.setAttribute('disabled', 'disabled')\n\n fetch(form.action, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(values)\n })\n .then(() => {\n submitButton.classList.add('success')\n submitButton.innerHTML = `${successIcon} Success`\n })\n .catch(() => {\n submitButton.classList.add('danger')\n submitButton.innerHTML = `${alertIcon} Submitting went wrong`\n })\n .finally(() => {\n submitButton.removeAttribute('disabled')\n form.reset()\n setTimeout(() => {\n submitButton.removeAttribute('disabled')\n submitButton.classList.remove('success', 'danger')\n submitButton.textContent = 'Submit'\n }, 3000)\n })\n})\n","import { on } from 'delegated-events'\n\non('click', 'button.plans-mobile-header', e => {\n const button = e.currentTarget\n button.parentNode?.classList?.toggle('plans-mobile-table__expanded')\n})\n","import { on } from 'delegated-events'\nimport { onDomReady } from 'utils/onDomReady'\n\nconst SHOW_ALL_TAG = 'All'\nconst HIDE_CLASSNAME = 'image-card--hidden'\nconst HIDE_EXCESS_DASHBOARD = 'image-card--excess'\nconst HIDE_BTN = 'image-cards-load-btn--hidden'\n\nconst visibleBlocks = () => {\n if (window.matchMedia('(max-width: 550px)').matches) {\n return 2\n } else if (window.matchMedia('(max-width: 850px)').matches) {\n return 3\n }\n return 8\n}\n\nconst getMoreBtn = () => document.querySelector('.image-cards-load-btn')\n\nconst getDashboardItems = () =>\n Array.from(document.querySelectorAll('.image-cards__content .image-card'))\n\nonDomReady(() => {\n if (getDashboardItems().length > visibleBlocks() + 1) {\n getMoreBtn()?.classList?.remove(HIDE_BTN)\n }\n\n getDashboardItems().forEach((item, i) => {\n if (i > visibleBlocks()) {\n item.classList.add(HIDE_EXCESS_DASHBOARD)\n }\n })\n}, false)\n\non('change', 'input[name=\"dashboards-tab\"]', e => {\n const input = e.target\n const { tag } = input.dataset\n if (!tag) {\n return\n }\n\n const currentTags = []\n\n getDashboardItems().forEach((item, i) => {\n if (SHOW_ALL_TAG === tag) {\n item.classList.remove(HIDE_EXCESS_DASHBOARD, HIDE_CLASSNAME)\n\n if (i > visibleBlocks()) {\n item.classList.add(HIDE_EXCESS_DASHBOARD)\n getMoreBtn()?.classList?.remove(HIDE_BTN)\n }\n return\n }\n\n const { tags } = item.dataset\n const normalizedTags = tags.split(',')\n\n if (normalizedTags.includes(tag)) {\n item.classList.remove(HIDE_CLASSNAME, HIDE_EXCESS_DASHBOARD)\n\n currentTags.push(item)\n\n if (currentTags.length > visibleBlocks() + 1) {\n item.classList.add(HIDE_EXCESS_DASHBOARD)\n getMoreBtn()?.classList?.remove(HIDE_BTN)\n } else {\n getMoreBtn()?.classList?.add(HIDE_BTN)\n }\n } else {\n item.classList.add(HIDE_CLASSNAME)\n item.classList.remove(HIDE_EXCESS_DASHBOARD)\n }\n })\n})\n\non('click', '.image-cards-load-btn', function () {\n getDashboardItems().forEach(item => {\n item.classList.remove(HIDE_EXCESS_DASHBOARD)\n })\n\n this.classList.add(HIDE_BTN)\n})\n","import { onDomReady } from 'utils/onDomReady'\n\nonDomReady(() => {\n const carouselElement = document.querySelector('.testimonials-carousel')\n if (!carouselElement) return\n\n import('swiper').then(({ default: Swiper, Navigation }) => {\n Swiper.use([Navigation])\n\n new Swiper(carouselElement, {\n spaceBetween: 20,\n slidesPerView: 1.1,\n disabledClass: 'disable',\n navigation: {\n nextEl: '.testimonials-carousel__control_next',\n prevEl: '.testimonials-carousel__control_prev'\n },\n breakpoints: {\n 391: {\n slidesPerView: 1\n },\n 769: {\n slidesPerView: 2.3\n },\n 1441: {\n slidesPerView: 3.3\n }\n }\n })\n })\n})\n","import { onDomReady } from 'utils/onDomReady'\nimport { on } from 'delegated-events'\nimport { trackEvent } from 'api/index'\n\nconst LIST_HORIZONTAL_CLASSNAME = 'destinations-carousel--horizontal'\n\nconst carouselList = () =>\n document.querySelector('.destinations-carousel__list')\n\nlet swiperInstance\n\nconst getDashboardItems = () =>\n Array.from(document.querySelectorAll('.destinations-carousel-item__wrap'))\n\nconst removedItems = []\n\nconst originalDashboardItems = []\n\nfunction saveOriginalOrder() {\n const dashboardItems = getDashboardItems()\n originalDashboardItems.push(...dashboardItems)\n}\n\nfunction restoreOriginalOrder() {\n const carousel = carouselList()\n originalDashboardItems.forEach(item => {\n carousel.appendChild(item)\n })\n}\n\nfunction showElementsHorizontally() {\n if (window.matchMedia('(max-width: 749px)').matches) {\n return getDashboardItems().length < 3\n }\n if (window.matchMedia('(max-width: 1023px)').matches) {\n return getDashboardItems().length < 5\n }\n return getDashboardItems().length < 10\n}\n\nfunction initializeSwiper() {\n const carouselListElement = document.querySelector('.destinations-carousel')\n if (!carouselListElement) return\n\n if (showElementsHorizontally()) {\n carouselListElement.classList.add(LIST_HORIZONTAL_CLASSNAME)\n if (swiperInstance) {\n swiperInstance.destroy()\n swiperInstance = null\n }\n\n return\n }\n\n const carouselElement = document.querySelector(\n '.destinations-carousel__slider'\n )\n if (!carouselElement) return\n\n import('swiper').then(({ default: Swiper, Navigation, Grid }) => {\n Swiper.use([Navigation, Grid])\n\n swiperInstance = new Swiper(carouselElement, {\n slidesPerView: 1.05,\n grid: {\n rows: 3\n },\n navigation: {\n nextEl: '.destinations-carousel__control_next',\n prevEl: '.destinations-carousel__control_prev'\n },\n breakpoints: {\n 750: {\n slidesPerView: 2.2\n },\n 1024: {\n slidesPerView: 3,\n grid: {\n rows: 3\n }\n }\n }\n })\n\n carouselListElement.classList.remove(LIST_HORIZONTAL_CLASSNAME)\n })\n}\n\nonDomReady(() => {\n saveOriginalOrder()\n initializeSwiper()\n window.addEventListener('resize', initializeSwiper)\n})\n\non('change', 'input[name=\"destinations-tab\"]', e => {\n const input = e.target\n const { tag } = input.dataset\n if (!tag) return\n\n trackEvent('Marketing:Destinations:Category selected', { name: tag })\n\n restoreOriginalOrder()\n\n getDashboardItems().forEach(item => {\n if (!(tag === 'All' || item.dataset.tag === tag)) {\n removedItems.push(item)\n item.remove()\n }\n })\n\n initializeSwiper()\n})\n","import { onDomReady } from 'utils/onDomReady'\n\nconst LIST_HORIZONTAL_CLASSNAME = 'similar-sources-carousel--horizontal'\nconst SIMPLE_CARDS_CLASSNAME = 'similar-sources-carousel--simple-cards'\n\nlet swiperInstance\n\nconst getSourcesItems = () =>\n Array.from(\n document.querySelectorAll(\n '.similar-sources-carousel__list .integration-card'\n )\n )\n\nfunction showElementsHorizontally() {\n if (window.matchMedia('(max-width: 749px)').matches) {\n return getSourcesItems().length < 3\n }\n if (window.matchMedia('(max-width: 1023px)').matches) {\n return getSourcesItems().length < 5\n }\n return getSourcesItems().length < 7\n}\n\nfunction initializeSlider() {\n const carouselElement = document.querySelector(\n '.similar-sources-carousel__slider'\n )\n const carouselElementWrap = document.querySelector(\n '.similar-sources-carousel'\n )\n if (!carouselElement) return\n\n if (showElementsHorizontally()) {\n carouselElementWrap.classList.add(LIST_HORIZONTAL_CLASSNAME)\n if (swiperInstance) {\n swiperInstance.destroy()\n swiperInstance = null\n }\n\n return\n }\n\n import('swiper').then(({ default: Swiper, Navigation, Grid }) => {\n Swiper.use([Navigation, Grid])\n\n const isSimpleCards = carouselElementWrap.classList.contains(\n SIMPLE_CARDS_CLASSNAME\n )\n\n const swiperConfig = {\n slidesPerView: 1.05,\n navigation: {\n nextEl: '.similar-sources-carousel__control_next',\n prevEl: '.similar-sources-carousel__control_prev'\n },\n grid: {\n fill: isSimpleCards ? 'row' : 'column',\n rows: isSimpleCards ? 1 : 2\n },\n breakpoints: {\n 750: {\n slidesPerView: 2.2,\n grid: {\n rows: 2\n }\n },\n 1024: {\n slidesPerView: 3\n }\n }\n }\n\n swiperInstance = new Swiper(carouselElement, swiperConfig)\n\n carouselElementWrap.classList.remove(LIST_HORIZONTAL_CLASSNAME)\n })\n}\n\nonDomReady(() => {\n initializeSlider()\n window.addEventListener('resize', initializeSlider)\n})\n","import { onDomReady } from 'utils/onDomReady'\n\nonDomReady(() => {\n const carouselElement = document.querySelector('.compare-price__slider')\n if (!carouselElement) return\n\n import('swiper').then(({ default: Swiper, Navigation }) => {\n Swiper.use([Navigation])\n\n new Swiper(carouselElement, {\n spaceBetween: 32,\n slidesPerView: 1,\n disabledClass: 'disable',\n navigation: {\n nextEl: '.compare-price__control_next',\n prevEl: '.compare-price__control_prev'\n },\n breakpoints: {\n 551: {\n slidesPerView: 'auto'\n },\n 1024: {\n slidesPerView: 3\n }\n }\n })\n })\n})\n","import { onDomReady } from 'utils/onDomReady'\n\nonDomReady(() => {\n const screenWidthCondition = window.matchMedia('(max-width: 1023px)')\n\n if (screenWidthCondition.matches) {\n const carouselElement = document.querySelector('.grid-component__slider')\n if (!carouselElement) return\n\n import('swiper').then(({ default: Swiper, Navigation, Pagination }) => {\n Swiper.use([Navigation, Pagination])\n\n new Swiper(carouselElement, {\n spaceBetween: 32,\n slidesPerView: 1,\n disabledClass: 'disable',\n pagination: {\n bulletClass: 'swiper-pagination-bullet',\n el: '.grid-component__pagination',\n clickable: true\n }\n })\n })\n }\n})\n","import { Application } from '@hotwired/stimulus'\nimport * as Sentry from '@sentry/browser'\n\nconst application = Application.start()\n\n// Configure Stimulus development experience\nif (process.env.RAILS_ENV === 'development') {\n application.debug = true\n window.Stimulus = application\n}\n\napplication.handleError = (error, message, detail) => {\n Sentry.setContext('errorDetails', { message, detail })\n Sentry.captureException(error)\n}\n\nexport { application }\n","// Import and register all your controllers from the importmap under controllers/*\n\nimport { application } from 'stimulus/application'\nimport { definitionsFromContext } from '@hotwired/stimulus-webpack-helpers'\n\nconst context = require.context('./controllers', true, /\\.js$/)\napplication.load(definitionsFromContext(context))\n","import { on } from 'delegated-events'\n\nconst initIntervalToggle = container => {\n on('click', 'ul.interval-toggle-switch > li', event => {\n selectToggle({ container, tab: event.currentTarget })\n })\n}\n\nconst selectToggle = ({ container, tab }) => {\n const tabs = container.querySelectorAll('ul.interval-toggle-switch > li')\n const tabContent = container.querySelectorAll('.interval-toggle-content')[0]\n tabs.forEach(tab => tab.classList.remove('active'))\n tab.classList.add('active')\n tabContent.setAttribute('data-display', tab.getAttribute('data-for'))\n}\n\nconst getActiveToggle = container =>\n container.querySelector('ul.interval-toggle-switch > li.active')\n\nexport { initIntervalToggle, selectToggle, getActiveToggle }\n","import 'marketing.sass'\nimport Rails from '@rails/ujs'\nimport * as Sentry from '@sentry/browser'\nimport { on } from 'delegated-events'\n\nimport 'utils/drawer'\nimport 'utils/simpleBar'\nimport 'utils/accordion'\nimport 'utils/filterData'\nimport 'utils/headerNav'\nimport 'utils/dashboardsFilter'\nimport 'utils/multiselect'\nimport 'utils/rolesTabs'\nimport 'utils/integrationsPopupPrevent'\nimport 'utils/beacons'\nimport 'utils/cookieConsent'\nimport 'utils/appHeight'\nimport 'utils/tooltip'\nimport 'utils/wistiaLazyLoading'\nimport 'utils/imgHighlights'\nimport 'utils/infiniteSlider'\n\nimport 'marketing/data-services-request'\nimport 'marketing/plans'\nimport 'marketing/image-cards'\n\nimport 'utils/testimonialsCarousel'\nimport 'utils/destinationsCarousel'\nimport 'utils/similarSourcesCarousel'\nimport 'utils/compareListCarousel'\nimport 'utils/gridComponentCarousel'\nimport 'utils/horizontalCarousel'\n\nimport 'stimulus'\n\nimport { onDomReady } from 'utils/onDomReady'\nimport { initIntervalToggle } from 'utils/intervalToggle'\nimport { getUserInfo } from 'api'\n\nRails.start()\n\nif (process.env.SENTRY_DSN) {\n Sentry.init({\n dsn: process.env.SENTRY_DSN,\n environment: process.env.RAILS_ENV,\n integrations: [new Sentry.BrowserTracing()],\n tracesSampleRate: 0.05,\n maxBreadcrumbs: 50,\n normalizeDepth: 3\n })\n}\n\non('click', '.collapsable > h5', ({ currentTarget }) => {\n currentTarget.parentNode?.classList?.toggle('collapsed')\n})\n\nonDomReady(() => {\n Array.from(document.querySelectorAll('.interval-toggle-container')).forEach(\n container => initIntervalToggle(container)\n )\n\n getUserInfo().then(response => {\n if (!response) {\n return\n }\n\n const { data } = response\n if (!data) {\n return\n }\n\n // gtm\n window.dataLayer = window.dataLayer || []\n window.dataLayer.push({ userId: data.id })\n // hj\n if (window.hj) {\n window.hj('identify', null, {\n user_id: data.id,\n account_id: data.selected_account_id\n })\n }\n // helpscout\n if (window.Beacon) {\n window.Beacon('identify', {\n email: data.email\n })\n\n window.Beacon('prefill', {\n email: data.email\n })\n }\n // clarity\n if (window.clarity) {\n window.clarity('set', 'user_id', data.id)\n window.clarity('set', 'account_id', data.selected_account_id)\n }\n\n if (data.email) {\n const typeformLink = document.querySelector('.dashboards-typeform-link')\n if (typeformLink) {\n typeformLink.href = `https://railsware2.typeform.com/to/ZqwOYff6#email=${encodeURIComponent(\n data.email\n )}`\n }\n }\n })\n})\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = ['slider', 'next', 'prev']\n\n connect() {\n const sliderElement = this.sliderTarget\n if (!sliderElement) return\n\n import('swiper').then(({ default: Swiper, Navigation }) => {\n Swiper.use(Navigation)\n\n new Swiper(sliderElement, {\n spaceBetween: 40,\n slidesPerView: 1,\n disabledClass: 'disable',\n navigation: {\n nextEl: this.nextTarget,\n prevEl: this.prevTarget\n },\n breakpoints: {\n 769: {\n slidesPerView: 1.4\n }\n }\n })\n })\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = ['expancedList', 'expanceButton', 'expanceColumn']\n\n toggleExpanceColumn(event) {\n const title = event.currentTarget\n const content = title.nextElementSibling\n const state = title.dataset.footerValue\n\n const isCollapsed = state === 'collapsed'\n const toggleTo = isCollapsed ? 'expanded' : 'collapsed'\n\n const contentHeight = content.scrollHeight\n const transitionSpeed = (contentHeight * 1.25).toFixed(2)\n\n title.classList.toggle('expanded')\n\n content.style.transition = `max-height ${transitionSpeed}ms ease-out, opacity ${transitionSpeed}ms ease-out`\n content.style.maxHeight = isCollapsed ? `${contentHeight}px` : null\n\n title.dataset.footerValue = toggleTo\n }\n\n toggleExpanceLinks() {\n this.expanceButtonTarget.classList.toggle('hidden')\n this.expancedListTarget.classList.toggle('hidden')\n\n const parent = this.expancedListTarget.parentElement\n const contentHeight = parent.scrollHeight\n this.expancedListTarget.parentElement.style.maxHeight = `${contentHeight}px`\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = ['name', 'output']\n\n greet() {\n this.outputTarget.textContent = `Hello, ${this.nameTarget.value}!`\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = ['video', 'pauseButton']\n\n connect() {\n this.playCount = 0\n this.maxPlays = 2.8\n this.fractionalPartPlayed = false\n this.manualPause = false\n this.videoTarget.loop = false\n this.videoTarget.addEventListener('ended', this.handleVideoEnded.bind(this))\n this.videoTarget.addEventListener('play', this.handlePlay.bind(this))\n this.videoTarget.addEventListener('pause', this.handlePause.bind(this))\n this.videoTarget.addEventListener(\n 'timeupdate',\n this.checkPartialPlay.bind(this)\n )\n this.updatePauseButtonVisibility()\n }\n\n handleVideoEnded() {\n this.playCount++\n if (this.playCount < Math.floor(this.maxPlays)) {\n this.videoTarget.play()\n } else if (!this.fractionalPartPlayed) {\n this.videoTarget.currentTime = 0\n this.videoTarget.play()\n }\n }\n\n checkPartialPlay() {\n const fractionalPart = this.maxPlays - Math.floor(this.maxPlays)\n const fractionalPlayTime = this.videoTarget.duration * fractionalPart\n if (\n this.playCount === Math.floor(this.maxPlays) &&\n this.videoTarget.currentTime >= fractionalPlayTime\n ) {\n this.videoTarget.pause()\n this.fractionalPartPlayed = true\n }\n }\n\n pauseVideo() {\n this.manualPause = true\n if (!this.videoTarget.paused) {\n this.videoTarget.pause()\n } else {\n this.videoTarget.play()\n }\n }\n\n handlePlay() {\n if (this.fractionalPartPlayed && this.manualPause) {\n this.fractionalPartPlayed = false\n this.playCount = 0\n }\n this.manualPause = false\n this.updatePauseButtonVisibility()\n }\n\n handlePause() {\n this.updatePauseButtonVisibility()\n }\n\n updatePauseButtonVisibility() {\n if (this.videoTarget.paused) {\n this.pauseButtonTarget.style.display = 'flex'\n } else {\n this.pauseButtonTarget.style.display = 'none'\n }\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = ['slider', 'pagination', 'next', 'prev']\n\n connect() {\n const sliderElement = this.sliderTarget\n if (!sliderElement) return\n\n const hasNavigation = this.hasNextTarget && this.hasPrevTarget\n\n import('swiper').then(({ default: Swiper, Navigation, Pagination }) => {\n Swiper.use([Pagination, Navigation])\n\n new Swiper(sliderElement, {\n spaceBetween: 32,\n slidesPerView: 1,\n pagination: {\n bulletClass: 'swiper-pagination-bullet',\n el: this.paginationTarget,\n clickable: true\n },\n navigation: hasNavigation\n ? {\n nextEl: this.nextTarget,\n prevEl: this.prevTarget\n }\n : false,\n breakpoints: {\n 1024: {\n slidesPerView: 3\n }\n }\n })\n })\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = ['operand', 'result']\n static values = { formula: String }\n\n connect() {\n this.element.addEventListener('submit', event => {\n event.preventDefault()\n\n this.calculate()\n })\n }\n\n calculate() {\n const allOperandsFilled = this.operandTargets.every(\n operand => operand.value.trim() !== ''\n )\n\n if (!allOperandsFilled) {\n return\n }\n\n let formula = this.formulaValue\n this.operandTargets.forEach(operand => {\n const value = parseFloat(operand.value) || 0\n formula = formula.replace(new RegExp(operand.dataset.name, 'g'), value)\n })\n\n try {\n const result = eval(formula)\n this.resultTarget.innerText = result.toFixed(2)\n } catch (e) {\n this.resultTarget.innerText = 'Error'\n }\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = ['slider', 'pagination']\n\n connect() {\n const sliderElement = this.sliderTarget\n if (!sliderElement) return\n\n if (window.innerWidth < 1024) {\n import('swiper').then(({ default: Swiper, Pagination, Grid }) => {\n Swiper.use([Pagination, Grid])\n\n new Swiper(sliderElement, {\n slidesPerView: 1,\n grid: {\n rows: 2\n },\n pagination: {\n bulletClass: 'swiper-pagination-bullet',\n el: this.paginationTarget,\n clickable: true\n }\n })\n })\n }\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = [\n 'expanceColumn',\n 'expandColumnSources',\n 'sources',\n 'showMoreButton'\n ]\n\n connect() {\n if (window.innerWidth >= 720) {\n this.expanceColumnTargets.forEach(target => {\n this.toggleExpanceColumn({ currentTarget: target })\n })\n }\n }\n\n toggleExpanceColumn(event) {\n const title = event.currentTarget\n const content = title.nextElementSibling\n const state = title.dataset.pricingTableValue\n\n const isCollapsed = state === 'collapsed'\n const toggleTo = isCollapsed ? 'expanded' : 'collapsed'\n\n const contentHeight = content.scrollHeight\n const transitionSpeed = (contentHeight * 1).toFixed(2)\n\n title.classList.toggle('expanded')\n\n content.style.transition = `max-height ${transitionSpeed}ms ease-out, opacity ${transitionSpeed}ms ease-out`\n content.style.maxHeight = isCollapsed\n ? `calc(${contentHeight}px + 1px)`\n : '0px'\n\n title.dataset.pricingTableValue = toggleTo\n }\n\n showMoreSources() {\n this.sourcesTargets.forEach(source => {\n source.classList.remove('pricing-table-cell__source--hidden')\n })\n this.showMoreButtonTarget.classList.add(\n 'pricing-table-cell__sources-expand--hidden'\n )\n\n const content = this.expandColumnSourcesTarget.nextElementSibling\n if (content) {\n content.style.transition = 'none'\n content.style.maxHeight = `${content.scrollHeight}px`\n }\n }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport * as Sentry from '@sentry/browser'\nimport SlimSelect from 'slim-select'\n\nconst EXTRACT_JSON_PATTERN = '_ejp'\n\nexport default class extends Controller {\n static targets = [\n 'multiselect',\n 'link',\n 'radioButton',\n 'source',\n 'destination',\n 'url'\n ]\n\n static values = {\n apiEndpoint: String,\n appHost: String\n }\n\n connect() {\n this.handleChange = this.handleChange.bind(this) // fix this for listener\n\n this.selectedSource = null\n\n fetch(`//${this.appHostValue}${this.apiEndpointValue}`)\n .then(response => response.json())\n .then(data => {\n this.selectedSource = this.getSelectedSource(data)\n\n if (!this.selectedSource) {\n this.urlTarget.style.display = 'none'\n return\n }\n\n const slimSelectData = this.generateSlimSelectData()\n const transformedOptions = this.transformDataToOptions(slimSelectData)\n\n this.initializeSlimSelect(transformedOptions)\n this.setSelectDefaultData()\n this.updateLinkState()\n })\n .catch(error => {\n this.urlTarget.style.display = 'none'\n Sentry.captureException(error)\n })\n }\n\n disconnect() {\n this.multiselectTarget?.removeEventListener('change', this.handleChange)\n this.select?.destroy()\n }\n\n getSelectedSource(data) {\n return data.sources.find(\n source => source.key === this.sourceTarget.dataset.sourceKey\n )\n }\n\n generateSlimSelectData() {\n return this.selectedSource.params.main.values.reduce((acc, value) => {\n const groupIndex = acc.findIndex(group => group.text === value.group)\n if (groupIndex !== -1) {\n acc[groupIndex].options.push({ text: value.label, value: value.value })\n } else {\n acc.push({\n text: value.group,\n options: [{ text: value.label, value: value.value }]\n })\n }\n return acc\n }, [])\n }\n\n transformDataToOptions(slimSelectData) {\n if (slimSelectData.length === 1) {\n return slimSelectData[0].options.map(option => ({\n text: option.text,\n value: option.value\n }))\n } else {\n return slimSelectData.map(group => ({\n label: group.text,\n options: group.options.map(option => ({\n text: option.text,\n value: option.value\n }))\n }))\n }\n }\n\n initializeSlimSelect(transformedOptions) {\n const {\n params: {\n main: { field }\n }\n } = this.selectedSource\n\n if (field === 'select') {\n this.urlTarget.querySelector('.base-input-label').textContent =\n 'Report type'\n this.multiselectTarget.removeAttribute('multiple')\n this.multiselectTarget.classList.add('ss-main--single')\n }\n\n const settings = {\n closeOnSelect: field === 'select',\n allowDeselect: true,\n maxSelected: 20,\n keepOrder: true\n }\n\n this.select = new SlimSelect({\n select: this.multiselectTarget,\n data: transformedOptions,\n settings: settings\n })\n this.multiselectTarget.addEventListener('change', this.handleChange)\n }\n\n updateLinkState() {\n const {\n params: {\n main: { field, name, values },\n from,\n to\n }\n } = this.selectedSource\n\n const link = this.linkTarget\n const selectedOption = this.select.getSelected()\n const selectedJSONOptions = selectedOption.map(\n it => values.find(v => v.value === it) || it\n )\n\n const radioButtons = this.radioButtonTargets.filter(\n radioButton => radioButton.checked\n )\n const selectedPeriod = radioButtons.length > 0 ? radioButtons[0].value : ''\n\n const sourceKey = this.sourceTarget.dataset.sourceKey\n const destinationKey = this.destinationTarget.dataset.destinationKey\n\n const queryParams = new URLSearchParams({\n source: sourceKey,\n destination: destinationKey,\n [`source_params[${from.name}]`]: selectedPeriod,\n [`source_params[${to.name}]`]: '{{today}}'\n })\n\n if (field === 'select') {\n queryParams.set(\n `source_params[${name}${EXTRACT_JSON_PATTERN}]`,\n JSON.stringify(selectedJSONOptions[0])\n )\n } else {\n selectedJSONOptions.forEach(option => {\n queryParams.append(\n `source_params[${name}${EXTRACT_JSON_PATTERN}][]`,\n JSON.stringify(option)\n )\n })\n }\n\n const url = `//${this.appHostValue}/app/importers/build?${queryParams}`\n\n link.setAttribute('href', url)\n\n if (selectedOption.length) {\n link.removeAttribute('disabled')\n } else {\n link.setAttribute('disabled', 'disabled')\n }\n }\n\n setSelectDefaultData() {\n const selectedOptions =\n this.multiselectTarget.dataset?.selectedOptions?.split(',')\n\n this.select.setSelected(selectedOptions)\n }\n\n handleChange() {\n this.updateLinkState()\n }\n}\n","// #goal show fullscreen navigation on mobile devices\n// #dk both Safari and Google Chrome conditionally show url bar which breaks 100vh...\n// https://medium.com/quick-code/100vh-problem-with-ios-safari-92ab23c852a8\nconst onResize = () => {\n const doc = document.documentElement\n doc.style.setProperty('--app-height', `${window.innerHeight}px`)\n}\n\nwindow.addEventListener('resize', onResize)\n\nonResize()\n"],"names":["map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports","onDomReady","callback","document","readyState","setTimeout","addEventListener","body","querySelector","hamburger","navigation","navigationList","handleFadeOutTransitionEnd","classList","remove","removeEventListener","toggle","contains","add","on","window","ResizeObserver","toggleAccordion","button","currentTarget","isExpanded","getAttribute","toggleTo","content","nextElementSibling","contentHeight","scrollHeight","transitionSpeed","toFixed","style","transition","maxHeight","setAttribute","querySelectorAll","forEach","item","wait","timeoutId","args","clearTimeout","apply","csrfToken","element","head","SAFE_METHODS","instance","axios","create","withCredentials","baseURL","appDomain","interceptors","request","use","config","method","includes","toLowerCase","headers","csrfMeta","getCsrfToken","error","Promise","reject","trackEvent","event","payload","post","memoize","fn","cache","Map","strX","JSON","stringify","result","get","set","err","getUserInfo","updateControlsVisibility","carouselElement","carouselElementWrapper","parentElement","prevControl","nextControl","arrowsControls","isAtTop","scrollTop","isAtBottom","clientHeight","isContentFits","scrollInterval","startScrolling","direction","stopScrolling","setInterval","scrollTo","clearInterval","scrollIncrement","scrollBy","top","behavior","carousels","length","SECTION_SELECTOR","SEARCH_SELECTOR","TYPES_SELECTOR","TAB_SELECTOR","TAB_MOBILE_SELECTOR","ITEM_HIDDEN_CLASSNAME","LOAD_MORE_SELECTOR","INTEGRATIONS_TYPE","METRIC_DIMENSION_TYPE","eventType","searchType","itemsPerPage","matchMedia","matches","Infinity","searchValues","tagValues","typeValues","visibleItemsCounts","showedMatchedItemsCounts","matchedItemsCounts","updateURL","filterType","urlParams","URLSearchParams","type","append","history","replaceState","toString","filterList","section","items","Array","from","popularFor","dataset","destination","title","itemTag","tag","itemType","popular","isSearchMatch","trim","itemTags","split","isCategoryMatch","isTypeMatch","isPopular","isTagPopular","isEmpty","every","remainingItems","display","searchTextEl","textContent","filtered","Boolean","scrollToStart","start","scrollIntoView","block","onTabChange","target","value","getClosestFilterType","closest","debounce","name","preventDefault","filter","i","checked","join","sections","location","search","getAll","searchInputEl","el","sourceTabEl","sourceTabMobileEl","NAVIGATION_BUTTON","NAVIGATION_ITEM","NAVIGATION_OVERLAY","ACTIVE_CLASSNAME","HEADER_TRANSPARENT_CLASSNAME","navigationOverlay","buttons","submenus","isNormalScreen","header","addHeaderTransparentClass","pathname","removeHeaderTransparentClassOnScroll","isSubMenuActive","scrollY","removeItemActive","submenu","parentItem","submenuItem","isActive","hasActiveItem","path","link","MULTISELECT_SELECTOR","MULTISELECT_CLEAR_SELECTOR","MULTISELECT_TOGGLE_SELECTOR","MULTISELECT_CHECKBOX_SELECTOR","MULTISELECT_ACTIVE_CLASSNAME","MULTISELECT_SEARCH_SELECTOR","MULTISELECT_ITEM_SELECTOR","clearSearchInput","dropdown","searchInput","focusSearchInput","multiselect","focus","updateSelectedItems","clearButton","selectedItemsContainer","originalText","checkboxes","updateSelectedItemsOnPageLoad","clearAllItems","excludeCheckbox","checkbox","dropdownMenu","stopPropagation","multiselectMenu","searchTerm","DASHBOARD_LOAD_MORE_SELECTOR","DASHBOARD_ACTION_ANCHOR","visibleItemsCount","categoryValue","categoryValueURL","sourceValue","destinationValue","searchValue","fullItemList","source","categoryHierarchyElement","categoryHierarchyData","categories","parse","categoryHierarchy","fromEntries","entries","key","children","list","dashboards","selectedCategory","sortedItems","sort","a","b","isAPrimary","primaryCategory","isBPrimary","singleSourceDiff","parsedData","sources","Number","position","innerHTML","showedMatchedItemsCount","matchedItemsCount","itemCategories","itemSources","itemDestinations","destinations","some","it","isCategoriesMatch","isSourcesMatch","isDestinationsMatch","isItemMatched","appendChild","array","eventName","this","push","index","indexOf","splice","syncFiltersFromURL","flatMap","categoryCheckboxes","sourceCheckboxes","destinationCheckboxes","text","collection","baseUrl","anchor","newParams","newUrl","pushState","targetElement","tabs","tabContents","tab","Beacon","subject","sourceName","Cookiebot","consent","Cookies","expires","dataLayer","tippyElements","then","tippy","placement","loadScript","url","script","createElement","onload","onerror","intersectionCallback","observer","entry","isIntersecting","disconnect","targets","IntersectionObserver","root","rootMargin","threshold","observe","defaultIndexValues","cuttentActiveItem","isIntervalActive","intervalIds","progressBarLine","pausedProgressBars","timerDuration","updateAccordionState","containerId","container","images","itemIndex","image","imageIndex","progressBarElement","progressBarKey","ProgressBar","strokeWidth","easing","duration","trailWidth","svgStyle","width","height","animate","updateProgressBar","numItems","autoSwitchAccordion","startAutoSwitching","updateAccordionFromLink","splitHash","hash","substring","blockId","blockIndex","parseInt","getElementById","resetAutoSwitching","nextIndex","pauseAutoSwitching","pause","resumeAutoSwitching","remainingTime","resume","timerId","updatePauseResumeAutoSwitching","itemsLength","isContainerVisible","visibleThreshold","rect","getBoundingClientRect","windowHeight","innerHeight","documentElement","isElementInViewport","currentIndex","containers","itemsContent","buttonIndex","pauseAccordion","resumeAccordion","itemBlock","defaultIndexValue","setDefaultIndex","sliderTracks","sliderTrack","boxes","totalBoxes","showBox","box","sliderItems","trackWidth","offsetWidth","totalWidth","reduce","agg","itemsWidth","setProperty","clonedItem","cloneNode","cloneOffset","animationDuration","speedMobile","speed","animation","animationPlayState","REQUIRED_FIELDS","TYPE_CHECKBOX_FIELDS","INPUT_ERROR_CLASS","form","submitButton","hasErrors","field","input","inputValues","values","fetch","action","removeAttribute","reset","parentNode","HIDE_CLASSNAME","HIDE_EXCESS_DASHBOARD","HIDE_BTN","visibleBlocks","getMoreBtn","getDashboardItems","currentTags","tags","Swiper","Navigation","spaceBetween","slidesPerView","disabledClass","nextEl","prevEl","breakpoints","swiperInstance","LIST_HORIZONTAL_CLASSNAME","carouselList","removedItems","originalDashboardItems","initializeSwiper","carouselListElement","destroy","Grid","grid","rows","dashboardItems","carousel","SIMPLE_CARDS_CLASSNAME","getSourcesItems","initializeSlider","carouselElementWrap","isSimpleCards","fill","Pagination","pagination","bulletClass","clickable","application","Application","debug","Stimulus","handleError","message","detail","Sentry","context","require","load","definitionsFromContext","selectToggle","tabContent","Rails","initIntervalToggle","response","data","userId","hj","user_id","account_id","selected_account_id","email","clarity","typeformLink","href","encodeURIComponent","sliderElement","sliderTarget","nextTarget","prevTarget","Controller","isCollapsed","footerValue","expanceButtonTarget","expancedListTarget","outputTarget","nameTarget","playCount","maxPlays","fractionalPartPlayed","manualPause","videoTarget","loop","handleVideoEnded","bind","handlePlay","handlePause","checkPartialPlay","updatePauseButtonVisibility","Math","floor","play","currentTime","fractionalPart","fractionalPlayTime","paused","pauseButtonTarget","hasNavigation","hasNextTarget","hasPrevTarget","paginationTarget","calculate","allOperandsFilled","operandTargets","operand","formula","formulaValue","parseFloat","replace","RegExp","eval","resultTarget","innerText","String","innerWidth","expanceColumnTargets","toggleExpanceColumn","pricingTableValue","sourcesTargets","showMoreButtonTarget","expandColumnSourcesTarget","EXTRACT_JSON_PATTERN","handleChange","selectedSource","appHostValue","apiEndpointValue","json","getSelectedSource","slimSelectData","generateSlimSelectData","transformedOptions","transformDataToOptions","initializeSlimSelect","setSelectDefaultData","updateLinkState","urlTarget","multiselectTarget","select","find","sourceTarget","sourceKey","params","main","acc","groupIndex","findIndex","group","options","label","option","settings","closeOnSelect","allowDeselect","maxSelected","keepOrder","SlimSelect","to","linkTarget","selectedOption","getSelected","selectedJSONOptions","v","radioButtons","radioButtonTargets","radioButton","selectedPeriod","destinationKey","destinationTarget","queryParams","selectedOptions","setSelected","apiEndpoint","appHost","onResize"],"sourceRoot":""}